如何编写 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 查询对数据集进行排序或分组的主要内容,如果未能解决你的问题,请参考以下文章