SQL序列号的出现

问题描述 投票:1回答:3

我想查找是否任何Name仅在连续序列中连续出现4个或更多SeqNo。如果seqNo中有一个中断,但连续有4行或更多行,那么我也需要该名称。

示例:

SeqNo    Name
10     | A
15     | A
16     | A
17     | A
18     | A
9      | B
10     | B
13     | B
14     | B
6      | C
7      | C
9      | C
10     | C
OUTPUT:
A

以下为任何帮助的内容。

create table testseq (Id int, Name char)

INSERT into testseq values
(10, 'A'),
(15, 'A'),
(16, 'A'),
(17, 'A'),
(18, 'A'),
(9, 'B'),
(10, 'B'),
(13, 'B'),
(14, 'B'),
(6, 'C'),
(7, 'C'),
(9, 'C'),
(10, 'C')

SELECT * FROM testseq
sql group-by row-number gaps-and-islands
3个回答
0
投票

您可以为此使用一些空缺技巧。

如果您希望name至少有4条连续记录,其中seqno1递增,那么您可以使用seqno and row_number()`之间的差异来定义组,然后进行汇总:

select distinct name
from (
    select t.*, row_number() over(partition by name order by seqno) rn
    from testseq t
) t
group by name, rn - seqno
having count(*) >= 4

注意,对于您的示例数据,此操作不返回任何行。 A具有3个连续记录,其中seqno递增1BC有两个。


0
投票

我不是真的把这看作是一个“空白和孤岛”的问题。您只是在寻找最少数量的相邻行。使用lag()lead()可以轻松处理:

select t.*
from (select t.*,
             lead(seqno, 3) over (partition by name order by seqno) as seqno_name_3
      from t
     ) t
where seqno_name_3 = seqno + 3;

这将检查具有相同名称的第三个序列号。第三个after表示连续四个名称相同。

如果您只想使用名称并处理重复项:

select distinct name
from (select t.*,
             lead(seqno, 3) over (partition by name order by seqno) as seqno_name_3
      from t
     ) t
where seqno_name_3 = seqno + 3;

如果序列号可以有间隔(但彼此相邻):

select distinct name
from (select t.*,
             lead(seqno, 3) over (partition by name order by seqno) as seqno_name_3,
             lead(seqno, 3) over (order by seqno) as seqno_3
      from t
     ) t
where seqno_name_3 = seqno_3;

0
投票

普通]中的解决方案> SQL,没有LAG()LEAD()ROW_NUMBER()

SELECT t1.Name
FROM testseq t1
WHERE (
    SELECT count(t2.Id)
    FROM testseq t2
    WHERE t2.Name=t1.Name
          and t2.Id between t1.Id and t1.Id+3
        GROUP BY t2.Name)>=4
GROUP BY t1.Name;
© www.soinside.com 2019 - 2024. All rights reserved.