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

如何编写sql查询对数据集进行排序或分组,sql,sql-server,sql-server-2008,sql-server-2005,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2005,Sql Server 2012,我在表a中有如下所示的数据。我想将memberID分组为一个集合,并对每个集合中的日期和时间进行排序,如下面的快照所示 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

我在表a中有如下所示的数据。我想将memberID分组为一个集合,并对每个集合中的日期和时间进行排序,如下面的快照所示

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年1月4日9:15:00 AM”大于memberID:def第一行日期时间“2014年1月4日9:17:00 AM”以黄色突出显示。这就是memberID ghi集合调整为第一个集合的主要原因,然后是memberID def集合,然后是meberID abc,jkl…等等

有谁能帮我写一个MS-SQL查询来实现最终的结果吗

非常感谢您的帮助。

您是否尝试在select语句的末尾添加按人名、日期和时间排序的订单

    SELECT Date_Time,PersonID,[Status] 
    FROM TABLE1
    GROUP BY Date_Time,PersonID,[Status] 
    ORDER BY PersonID,Date_Time
请注意,如果是字符串而不是日期字段,则对日期\时间列进行排序将不会像预期的那样有效


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

如果我正确理解您的问题,您需要使用最小聚合将表连接回自身,以建立排序顺序:

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
这是:

不过,该方法与中的方法相同,只是语法不同。它使用最小值计算最小日期时间值。。。结束这使得到派生表的连接完全没有必要


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

ORDER BY Date\u Time,person\u IDY您的select语句不会成功运行;如果使用group by,则需要对group by节中未包含的其他列使用聚合函数示例:从中选择日期\时间、PERSONID、COUNTSTATUS。。。etc@sgedes在您提供的链接中的示例中,您可以看到选择部分中的所有列都存在于分组中。@simsim-现在我明白您的意思了-您完全正确。这不包括状态。抱歉。是的@sgedes你完全正确。非常感谢您提出的快速解决方案。它非常简单,运行速度非常快。
SELECT
  Date_Time,
  PersonID,
  Status
FROM
  dbo.atable
ORDER BY
  MIN(Date_Time) OVER (PARTITION BY PersonID),
  PersonID,
  Date_Time
;