【问题标题】:How to group by multiple columns and order by date in SQL?如何在 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 天的开始日期匹配,依此类推。

【问题讨论】:

    标签: sql sql-server tsql sql-order-by window-functions


    【解决方案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 列,我引用了错误的列。像魅力一样工作,干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2020-08-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多