SQL Server:按顺序分组
我有这张桌子:SQL Server:按顺序分组,sql,sql-server-2008,group-by,Sql,Sql Server 2008,Group By,我有这张桌子: CREATE TABLE yourtable ( HevEvenementID INT, HjvNumeSequJour INT, HteTypeEvenID INT ); INSERT INTO yourtable VALUES (12074, 1, 66), (12074, 2, 66), (12074, 3, 5), (12074, 4, 7), (12074, 5, 17), (12074, 6, 17), (12
CREATE TABLE yourtable
(
HevEvenementID INT,
HjvNumeSequJour INT,
HteTypeEvenID INT
);
INSERT INTO yourtable
VALUES (12074, 1, 66), (12074, 2, 66), (12074, 3, 5),
(12074, 4, 7), (12074, 5, 17), (12074, 6, 17),
(12074, 7, 17), (12074, 8, 17), (12074, 9, 17), (12074, 10, 5)
我需要按连续的HteTypeEvenID
进行分组。现在,我正在这样做:
SELECT
HevEvenementID,
MAX(HjvNumeSequJour) AS HjvNumeSequJour,
HteTypeEvenID
FROM
(SELECT
HevEvenementID,
HjvNumeSequJour,
HteTypeEvenID
FROM
yourtable y) AS s
GROUP BY
HevEvenementID, HteTypeEvenID
ORDER BY
HevEvenementID,HjvNumeSequJour, HteTypeEvenID
其中返回以下内容:
HevEvenementID HjvNumeSequJour HteTypeEvenID
---------------------------------------------
12074 2 66
12074 4 7
12074 9 17
12074 10 5
我需要按连续的HteTypeEvenID
进行分组,以获得此结果:
HevEvenementID HjvNumeSequJour HteTypeEvenID
----------------------------------------------
12074 2 66
12074 3 5
12074 4 7
12074 9 17
12074 10 5
有什么建议吗?在SQL Server中,您可以通过聚合和行号差异来实现这一点:
select HevEvenementID, HteTypeEvenID,
max(HjvNumeSequJour)
from (select t.*,
row_number() over (partition by HevEvenementID order by HjvNumeSequJour) as seqnum_1,
row_number() over (partition by HevEvenementID, HteTypeEvenID order by HjvNumeSequJour) as seqnum_2
from yourtable t
) t
group by HevEvenementID, HteTypeEvenID, (seqnum_1 - seqnum_2)
order by max(HjvNumeSequJour);
我认为理解其工作原理的最好方法是通过观察子查询的结果。您将看到两个值之间的差异如何定义相邻值组。在SQL Server中,您可以通过行数的聚合和差异来实现这一点:
select HevEvenementID, HteTypeEvenID,
max(HjvNumeSequJour)
from (select t.*,
row_number() over (partition by HevEvenementID order by HjvNumeSequJour) as seqnum_1,
row_number() over (partition by HevEvenementID, HteTypeEvenID order by HjvNumeSequJour) as seqnum_2
from yourtable t
) t
group by HevEvenementID, HteTypeEvenID, (seqnum_1 - seqnum_2)
order by max(HjvNumeSequJour);
我认为理解其工作原理的最好方法是通过观察子查询的结果。您将看到两个值之间的差异是如何定义相邻值组的。非常感谢,这并不完全是我需要的,但已经实现了。。我需要结果由hjvNumeSequ排序,您的查询由HteTypeEvenID@MelodieGauthier . . . 否。原始查询没有按任何内容排序,因为它没有
order by
子句。我按添加了订单。非常感谢,这不完全是我所需要的,但已经快到了。。我需要结果由hjvNumeSequ排序,您的查询由HteTypeEvenID@MelodieGauthier . . . 否。原始查询没有按任何内容排序,因为它没有order by
子句。我按
添加了订单。连续的HteTypeEvenID?他们都一样。vtcconseutivehtetypeevenid?他们都一样。职业训练局