SQL Server:按组连续 [英] SQL Server : group by consecutive

查看:155
本文介绍了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, HteTypeEvenID

which returns this:

HevEvenementID  HjvNumeSequJour HteTypeEvenID
---------------------------------------------
12074            2              66
12074            4               7
12074            9              17
12074           10               5

I 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               5

Any 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:按组连续的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆