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