如何编写 sql 查询对数据集进行排序或分组

Posted

技术标签:

【中文标题】如何编写 sql 查询对数据集进行排序或分组【英文标题】:How to write a sql query to Sort or Group the dataset 【发布时间】:2014-05-29 04:30:49 【问题描述】:

我在 表 A 中有数据,如下所示。我想将 memberID 分组为一组,并对每组中的 Date_Time 进行排序,如下面的快照所示

Date_Time        PersonID     Status
4/2/14 10:15 AM    ghi        Closed
4/1/14 9:15 AM     ghi        Cancelled
4/1/14 11:00 AM    abc        Cancelled
4/2/14 8:12 AM     def        Closed
4/1/14 9:17 AM     def        Hold
4/3/14 2:17 PM     abc        Hold
4/2/14 8:30 AM     abc        Open
4/3/14 8:16 AM     jkl        Closed
4/1/14 12:10 PM    jkl        Open
4/1/14 11:30 AM    abc        Hold

下面附上的最终示例快照您将看到 memberID: ghi 第一行 date time '4/1/2014 9:15: 00 AM' 大于 memberID: def 第一行 date_Time '4/1/2014 9:17: 00 AM' 以黄色突出显示。这就是 memberID ghi 将调整设置为第一个设置,然后是 memberID def 设置的主要原因,然后meberID abc, jkl ... 等等...

请有人帮助我如何编写 MS-SQL 查询以达到最终结果。

非常感谢您的帮助。

【问题讨论】:

ORDER BY date_time, person_id 【参考方案1】:

如果我正确理解您的问题,您需要使用min 聚合将join 表返回到自身以建立排序顺序:

select t.*
from yourtable t
  join (
    select personid, 
      min(date_time) min_date_time
    from yourtable
    group by personid
    ) t2 on t.personid = t2.personid
order by t2.min_date_time, t.date_time
SQL Fiddle Demo

【讨论】:

是的@sgeddes 你是绝对正确的。非常感谢您提出的快速解决方案。它非常简单,而且运行速度非常快。【参考方案2】:

这里是another way:

SELECT
  Date_Time,
  PersonID,
  Status
FROM
  dbo.atable
ORDER BY
  MIN(Date_Time) OVER (PARTITION BY PersonID),
  PersonID,
  Date_Time
;

不过,该方法与sgeddes's answer 中的方法相同,只是语法不同。它使用MIN(...) OVER (...) 计算最小Date_Time 值。这使得完全没有必要连接到派生表。

另一个小区别是我在 ORDER BY 子句中添加了PersonID,以确保具有相同最小Date_Time 值的人不会混淆他们的行。

【讨论】:

【参考方案3】:

您是否尝试在您的选择语句末尾添加Order By PersonID, Date_Time

请注意,如果 Date_Time 列是字符串而不是 Date 字段,则对您进行排序将无法正常工作。

提供您迄今为止所做的代码示例,以便我们能够更清楚地了解您的问题,从而更有效地帮助您。

【讨论】:

【参考方案4】:
    SELECT Date_Time,PersonID,[Status] 
    FROM TABLE1
    GROUP BY Date_Time,PersonID,[Status] 
    ORDER BY PersonID,Date_Time

【讨论】:

您的选择语句不会成功运行;如果您使用 group by,则需要对不在 group by 部分中的其他列使用聚合函数 示例: SELECT DATE_TIME, PERSONID, COUNT(STATUS) From... etc @sgeddes 在您提供的链接中的示例中,您可以看到Select 部分中的所有列都存在于Group by 部分中。 @simsim -- 现在我明白你在说什么了 -- 你是绝对正确的。这不包括Status。道歉。

以上是关于如何编写 sql 查询对数据集进行排序或分组的主要内容,如果未能解决你的问题,请参考以下文章

sql 分组排序

使用 SQL Hana 对数据进行分组

sql子查询可以再分组吗

使用 SQL 查询对新列进行分组和扩展?

SQL如何对分组后的结果进行排序并且取前几名

SQL如何对分组后运算出来的结果进行排序