SQL Max() 返回多个值
Posted
技术标签:
【中文标题】SQL Max() 返回多个值【英文标题】:SQL Max() Returning multiple values 【发布时间】:2016-06-08 16:41:23 【问题描述】:早上好/下午好,感谢您检查这个,我正在努力弄清楚我错过了什么。
试图根据结果(单独的任务)建立一个日程安排系统,但由于我们的日程安排每天/每周更改多次,因此会产生太多重复。
Select modified, local_Start_Time, local_End_Time, seg_code, Date, employee
from schedule_table
Where employee= '###' and seg_code = ‘schedule’
and Date in ('20160606', '20160607', '20160608', '20160609')
group by modified
,local_start_time
,local_end_time
,seg_code
,date
,employee
当我运行它时,我得到了 Table 的预期结果。
我尝试在“已修改”选择周围添加 max () 以将其限制为最新条目,但这并没有改变上述任何内容。然后我添加了
max(Local_START_Time)
,max(Local_END_time)
,max(modified)
对于选择,这确实将其限制为每位员工 1 行,但它现在采用与此相反的条目 [表 2][2]
我尝试在开始/结束时间将其从最大值调整为最小值,它修复了一些并破坏了其他一些。
我对 SQL 还很陌生,曾尝试查看其他问题/视频,但无济于事。我理解将“最大值”修改为最近时间条目的逻辑,然后从这两个单元格中获取最大值(最高开始/结束时间),但在完美的世界中,我只希望有一个最大值(修改)和然后将其与开始和结束时间配对。
谁能用我所缺少的东西来指导我朝着正确的方向前进,或者使用 1 个 max 语句,或者完全使用所有 3 个 / 一个不同的语句?
使用 SQL Management Studio,如果我遗漏了任何其他关键细节,我们深表歉意,感谢您的帮助,并期待了解更多信息并帮助他人!
编辑为了澄清我遇到的挑战,Updated Image,绿色单元格都是每个日期的最新更新时间表,而红色单元格是 max(start /结束时间)。
希望有帮助
【问题讨论】:
【参考方案1】:如果你想要最大值,你应该在没有你为聚合函数中的列设置的分组的情况下执行查询(最大值)
Select max(modified), max(local_Start_Time), max(local_End_Time), seg_code, Date, employee
from schedule_table
Where employee= '###' and seg_code = ‘schedule’
and Date in ('20160606', '20160607', '20160608', '20160609')
group by seg_code
,date
,employee
为了获取与 max(modified) 相关的行,您应该使用子查询
Select modified, local_Start_Time, local_End_Time, seg_code, Date, employee
from schedule_table
where modified = ( select max(modified)
from schedule_table
Where employee= '###' and seg_code = ‘schedule’
and Date in ('20160606', '20160607', '20160608', '20160609')
);
然后只获取员工
Select modified, local_Start_Time, local_End_Time, seg_code, Date, employee
from schedule_table
where modified = ( select max(modified)
from schedule_table
Where employee= '###' and seg_code = ‘schedule’
and Date in ('20160606', '20160607', '20160608', '20160609')
)
and employee= '###'
;
【讨论】:
也谢谢你,正如上面发布的那样,它仍然从表中获取最高的开始/结束时间,而不是与实际修改时间匹配的时间。你有什么想法可以避免这种情况发生吗? 如果我理解正确,您想获得与表中最大(修改)(最近)时间相关的开始/结束时间? 这是正确的,否则可能需要最新的更新时间和现在已过期的第一个时间表。 这看起来应该可以工作,当我运行查询时,它会返回对整个表而不是每个人进行的最后一次编辑。但我正在继续尝试纠正那 这个人是员工?【参考方案2】:添加max()
时,还需要删除group by
中的字段:
Select max(modified), max(local_Start_Time), max(local_End_Time),
seg_code, Date, employee
from schedule_table
where employee= '###' and seg_code = 'schedule' and
Date in ('20160606', '20160607', '20160608', '20160609')
group by seg_code, date, employee;
否则,查询会为列的每个值返回一个单独的行——max()
将只是该行中的值。
【讨论】:
谢谢你,更新了,它会返回每个员工每天预期的一行,但是表本身仍然存在挑战。它占用了最大(逻辑上有意义)的计划时间,这将是分配的最高开始时间,即使它并不总是准确的。是否可以使用其他命令?【参考方案3】:这就是我得到的:
SELECT DISTINCT
[date],
employee,
max(modified) OVER (PARTITION BY [date]) AS max_modified,
max(start_time) OVER (PARTITION BY [date]) AS max_start,
max(end_time) OVER (PARTITION BY [date]) AS max_end
FROM Table_1
GROUP BY
[date], employee, modified, start_time, end_time
或者如果您想按日期和修改日期分开,
SELECT DISTINCT
[date],
employee,
max(modified) OVER (PARTITION BY [date],employee) AS max_modified,
max(start_time) OVER (PARTITION BY [date]) AS max_start,
max(end_time) OVER (PARTITION BY [date]) AS max_end
FROM Table_1
GROUP BY [date], employee, modified, start_time, end_time
【讨论】:
以上是关于SQL Max() 返回多个值的主要内容,如果未能解决你的问题,请参考以下文章