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

时间:2014-05-29 04:30:50

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2012

我在表格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 第一行日期时间'2014年4月1日9:15: 00 AM' 大于 memberID: def 第1行 date_Time '4/1/2014 9:17: 00 AM' 以黄色突出显示。这就是 memberID ghi 将调整设置为第一组,然后依次为 memberID def 设置的主要原因 meberID abc jkl ... 等......

enter image description here

有人可以帮我解决如何编写MS-SQL查询以实现最终结果。

非常感谢你的帮助。

4 个答案:

答案 0 :(得分:4)

如果我正确理解您的问题,您需要使用join聚合min将表格重新发送给自己以建立排序顺序:

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

答案 1 :(得分:1)

此处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中的方法相同,它只是具有不同的语法。它使用Date_Time计算最小MIN(...) OVER (...)值。这使得对派生表的连接完全没有必要。

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

答案 2 :(得分:0)

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

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

提供您目前所做工作的代码示例,以便我们能够更清楚地了解您的问题,以便我们更有效地帮助您。

答案 3 :(得分:-1)

    SELECT Date_Time,PersonID,[Status] 
    FROM TABLE1
    GROUP BY Date_Time,PersonID,[Status] 
    ORDER BY PersonID,Date_Time