本文介绍了SQL Server:按组连续的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
CREATE TABLE yourtable ( HevEvenementID INT, HjvNumeSequJour INT, HteTypeEvenID INT ); (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,17) ,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$ b
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有什么建议?
<$ c $ (选择t。*, row_number()over(由HjvNumeSequJour分区,按HevEvenementID顺序划分)为seqnum_1, row_number()选择HevEvenementID,HteTypeEvenID, max(HjvNumeSequJour) ()分区(由HevEvenementID分区,HteTypeEvenID由HjvNumeSequJour分区)作为seqnum_2 来自yourtable t )t 分组由HevEvenementID,HteTypeEvenID,(seqnum_1 - seqnum_2) order by max (HjvNumeSequJour);我认为理解这种工作方式的最好方法是盯着子查询的结果。您将看到两个值之间的差异是如何定义相邻值组的。
I have this table:
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)I need to group by consecutive HteTypeEvenID. Right now I am doing this:
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, HteTypeEvenIDwhich returns this:
HevEvenementID HjvNumeSequJour HteTypeEvenID --------------------------------------------- 12074 2 66 12074 4 7 12074 9 17 12074 10 5I need to group by consecutive HteTypeEvenID, to get this result:
HevEvenementID HjvNumeSequJour HteTypeEvenID ---------------------------------------------- 12074 2 66 12074 3 5 12074 4 7 12074 9 17 12074 10 5Any suggestions?
解决方案In SQL Server, you can do this with aggregation and difference of row numbers:
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);I think the best way to understand how this works is by staring at the results of the subquery. You will see how the difference between the two values defines the groups of adjacent values.
更多推荐
SQL Server:按组连续
发布评论