如何使用聚合对 SQL 中的结果集进行两次排序?
How can I sort a result set twice in SQL with an aggregate?
我有一个时间跟踪数据库,我试图从中获取按工人姓名和工作周分组的每周总工作时数列表。
这是我对 return 所有必要数据的查询:
SELECT [Timesheet Period], [Employee Name], SUM([Hours]) AS Hours FROM timetracker
WHERE [Date Worked] BETWEEN '2020-12-06' AND '2020-12-26'
AND [Hours] > 0
AND [Mgr Name] <> ''
GROUP BY [Employee Name], [Timesheet Period]
我希望数据像这样排序:
| Timesheet Period | Employee Name | Hours |
--------------------------------------------------------------
| 12/06/20 - 12/12/20 | Joe Smith | 70 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Joe Smith | 46 |
--------------------------------------------------------------
| 12/20/20 - 12/26/20 | Joe Smith | 42 |
--------------------------------------------------------------
| 12/06/20 - 12/12/20 | Robin Williams | 40 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Robin Williams | 40 |
--------------------------------------------------------------
| 12/20/20 - 12/26/20 | Robin Williams | 40 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Jane Doe | 43 |
--------------------------------------------------------------
| 12/20/20 - 12/26/20 | Jane Doe | 54 |
--------------------------------------------------------------
| 12/06/20 - 12/12/20 | Keanu Reeves | 45 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Keanu Reeves | 42 |
--------------------------------------------------------------
| 12/06/20 - 12/12/20 | Derek Zoolander | 40 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Derek Zoolander | 40 |
--------------------------------------------------------------
因此,员工在给定时间范围内从最高总小时数降序排列,而且他们的工作时间也按姓名分组,并按他们在给定时间范围内工作的周数升序排列。
我不确定这是否可行,但我想我可以以某种方式对每个名称进行 SUM(Hours) 和排序,然后使用该结果对周数进行排序。欢迎任何想法:)
您可以在 ORDER BY
中使用 window 函数:
SELECT [Timesheet Period], [Employee Name], SUM([Hours]) AS Hours
FROM timetracker
WHERE [Date Worked] BETWEEN '2020-12-06' AND '2020-12-26' AND
[Hours] > 0 AND
[Mgr Name] <> ''
GROUP BY [Employee Name], [Timesheet Period]
ORDER BY SUM(SUM([Hours]) OVER (PARTITION BY [Employee Name]) DESC,
[Employee Name],
MIN([Date Worked]);
SELECT [Timesheet Period], [Employee Name], SUM([Hours]) AS Hours FROM timetracker
WHERE [Date Worked] BETWEEN '2020-12-06' AND '2020-12-26'
AND [Hours] > 0
AND [Mgr Name] <> ''
GROUP BY [Employee Name], [Timesheet Period]
Order by SUM([Hours]), [Timesheet Period]
我有一个时间跟踪数据库,我试图从中获取按工人姓名和工作周分组的每周总工作时数列表。
这是我对 return 所有必要数据的查询:
SELECT [Timesheet Period], [Employee Name], SUM([Hours]) AS Hours FROM timetracker
WHERE [Date Worked] BETWEEN '2020-12-06' AND '2020-12-26'
AND [Hours] > 0
AND [Mgr Name] <> ''
GROUP BY [Employee Name], [Timesheet Period]
我希望数据像这样排序:
| Timesheet Period | Employee Name | Hours |
--------------------------------------------------------------
| 12/06/20 - 12/12/20 | Joe Smith | 70 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Joe Smith | 46 |
--------------------------------------------------------------
| 12/20/20 - 12/26/20 | Joe Smith | 42 |
--------------------------------------------------------------
| 12/06/20 - 12/12/20 | Robin Williams | 40 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Robin Williams | 40 |
--------------------------------------------------------------
| 12/20/20 - 12/26/20 | Robin Williams | 40 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Jane Doe | 43 |
--------------------------------------------------------------
| 12/20/20 - 12/26/20 | Jane Doe | 54 |
--------------------------------------------------------------
| 12/06/20 - 12/12/20 | Keanu Reeves | 45 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Keanu Reeves | 42 |
--------------------------------------------------------------
| 12/06/20 - 12/12/20 | Derek Zoolander | 40 |
--------------------------------------------------------------
| 12/13/20 - 12/19/20 | Derek Zoolander | 40 |
--------------------------------------------------------------
因此,员工在给定时间范围内从最高总小时数降序排列,而且他们的工作时间也按姓名分组,并按他们在给定时间范围内工作的周数升序排列。
我不确定这是否可行,但我想我可以以某种方式对每个名称进行 SUM(Hours) 和排序,然后使用该结果对周数进行排序。欢迎任何想法:)
您可以在 ORDER BY
中使用 window 函数:
SELECT [Timesheet Period], [Employee Name], SUM([Hours]) AS Hours
FROM timetracker
WHERE [Date Worked] BETWEEN '2020-12-06' AND '2020-12-26' AND
[Hours] > 0 AND
[Mgr Name] <> ''
GROUP BY [Employee Name], [Timesheet Period]
ORDER BY SUM(SUM([Hours]) OVER (PARTITION BY [Employee Name]) DESC,
[Employee Name],
MIN([Date Worked]);
SELECT [Timesheet Period], [Employee Name], SUM([Hours]) AS Hours FROM timetracker
WHERE [Date Worked] BETWEEN '2020-12-06' AND '2020-12-26'
AND [Hours] > 0
AND [Mgr Name] <> ''
GROUP BY [Employee Name], [Timesheet Period]
Order by SUM([Hours]), [Timesheet Period]