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() 返回多个值的主要内容,如果未能解决你的问题,请参考以下文章

从 PL/SQL 函数返回多个值

swift函数返回多个值

如何访问从sql函数获取的java中的多个返回值

用户定义的函数在sql中返回多个值

Sql 过程如何使用 IN OUT 返回多个值:PLS-00103 错误

在单个 oracle sql 语句中返回多个值