如何在 SQL 中按多列分组并按日期排序?

Posted

技术标签:

【中文标题】如何在 SQL 中按多列分组并按日期排序?【英文标题】:How to group by multiple columns and order by date in SQL? 【发布时间】:2019-11-25 00:35:39 【问题描述】:

我想在数据库表中排序结果,使其如下所示...

----------------------------------------------------------------------
Id                                   | Day | Start Date | End Date   |
----------------------------------------------------------------------
13D377E8-7674-4BE8-ACDF-472B634342D3 |  1  | 2019-11-26 | 2019-11-26 |
13D377E8-7674-4BE8-ACDF-472B634342D3 |  2  | 2019-11-27 | 2019-11-27 | 
13D377E8-7674-4BE8-ACDF-472B634342D3 |  3  | 2019-11-28 | 2019-11-28 |
78C8F3AD-DE5B-48BD-849A-6E39C7EC6200 |  1  | 2019-11-27 | 2019-11-27 |
78C8F3AD-DE5B-48BD-849A-6E39C7EC6200 |  2  | 2019-11-28 | 2019-11-28 |
78C8F3AD-DE5B-48BD-849A-6E39C7EC6200 |  3  | 2019-11-29 | 2019-11-29 |
B73ECD8B-5760-4F92-94E5-CF5270AEE36B |  1  | 2019-11-28 | 2019-11-28 |
B73ECD8B-5760-4F92-94E5-CF5270AEE36B |  2  | 2019-11-29 | 2019-11-29 |
B73ECD8B-5760-4F92-94E5-CF5270AEE36B |  3  | 2019-11-30 | 2019-11-30 |
每组日期按 ID 分组 需要在组内从最低到最高显示天数 组需要按每组第一天的开始日期升序排列

我尝试了以下操作...

SELECT Id, Day, Start Date, End Date
FROM Table
GROUP BY Id, Day, Start Date, End Date

但可以预见的是,它的排序不正确。您可以从下图中看到,由于开始日期最早,应该首先出现的组出现在列表的更下方。

我该如何解决这个问题?

编辑

我使用以下 SQL 尝试了以下解决方案...

SELECT Id, Day, StartDate, EndDate FROM AssessmentCentreStandardAssessmentAvailabilityScheduleItemSchedule
WHERE AssessmentCentreStandardAssessmentAvailabilityScheduleItemId in 
(SELECT Id FROM AssessmentCentreStandardAssessmentAvailabilityScheduleItem
WHERE AssessmentCentreStandardAssessmentAvailabilityId = 
(SELECT Id FROM AssessmentCentreStandardAssessmentAvailability WHERE AssessmentCentreId = 
(SELECT Id FROM AssessmentCentre WHERE Name = 'Daily Assessment Centre')))
ORDER BY
    MIN(StartDate) OVER(PARTITION BY Id),
    Id,
    Day,
    StartDate

请注意,为简洁起见,我没有在原始帖子中包含 where 子句。我不认为它会影响结果,但发布只是以防万一。

这将返回以下内容......

它不是按 Id 或 Day 分组的,只是似乎按 Start Date 升序排序。

只是在视觉上重申标准,以防不清楚:

我需要将具有相同 ID 的记录组合在一起。 我需要按升序显示的 id 组中的每一天(请注意,没有与同一 Id 相关联的重复天数) 然后我需要在每个组的第一天的开始日期之前对所有组进行排序。会有重叠 - 因此第 1 组中第 2 天的开始日期将与第 2 组中第 1 天的开始日期匹配,依此类推。

【问题讨论】:

【参考方案1】:

要按组的最短开始日期排序,您可以在order by 子句中创建一个窗口min()

SELECT Id, Day, Start_Date, End_Date
FROM Table
-- GROUP BY Id, Day, Start_Date, End_Date
ORDER BY
    MIN(Start_Date) OVER(PARTITION BY Id),
    Id,
    Day,
    Start_Date,
    End_date

注意:您没有在SELECT 子句中使用任何聚合函数这一事实让我怀疑您实际上不需要GROUP BY 子句。我评论了查询的那一部分,如果出于某种我想不到的原因确实需要它,请随时将其添加回来(如果您只需要删除一些重复项,请使用SELECT DISTINCT,这会使意图更清晰) .

Demo on DB Fiddle

身份证 |天 |开始日期 |结束日期 :------------------------------------------------ | --: | :----------------- | :----------------- 13D377E8-7674-4BE8-ACDF-472B634342D3 | 1 | 26/11/2019 00:00:00 | 26/11/2019 00:00:00 13D377E8-7674-4BE8-ACDF-472B634342D3 | 2 | 27/11/2019 00:00:00 | 27/11/2019 00:00:00 13D377E8-7674-4BE8-ACDF-472B634342D3 | 3 | 28/11/2019 00:00:00 | 28/11/2019 00:00:00 78C8F3AD-DE5B-48BD-849A-6E39C7EC6200 | 1 | 27/11/2019 00:00:00 | 27/11/2019 00:00:00 78C8F3AD-DE5B-48BD-849A-6E39C7EC6200 | 2 | 28/11/2019 00:00:00 | 28/11/2019 00:00:00 78C8F3AD-DE5B-48BD-849A-6E39C7EC6200 | 3 | 29/11/2019 00:00:00 | 29/11/2019 00:00:00 B73ECD8B-5760-4F92-94E5-CF5270AEE36B | 1 | 28/11/2019 00:00:00 | 28/11/2019 00:00:00 B73ECD8B-5760-4F92-94E5-CF5270AEE36B | 2 | 29/11/2019 00:00:00 | 29/11/2019 00:00:00 B73ECD8B-5760-4F92-94E5-CF5270AEE36B | 3 | 30/11/2019 00:00:00 | 30/11/2019 00:00:00

【讨论】:

不幸的是,这个解决方案不起作用。我已经详细说明了作为对原始帖子的编辑而得到的回复。谢谢 @Konzy262:这似乎工作正常......我在我的答案中添加了一个 DB Fiddle 供您参考。 我的错。在实际表中有 2 个 id 列,我引用了错误的列。像魅力一样工作,干杯。

以上是关于如何在 SQL 中按多列分组并按日期排序?的主要内容,如果未能解决你的问题,请参考以下文章

C# 需要将 sql 中的数据放入 DataGridView 并在行中按日期排序

在 Hive 和 Presto 中按分组聚合字符串并按顺序排序

如何在 React Native 中按日期分组

在 PyQt 模型中按多列排序

如何在 Laravel 中按日期排序消息

如何在oracle sql developer中按年和月分组获取当前财政年度的数据?