如何找到连续出现两次以上的号码?
how to find the number has more than two consecutive appearences?
来源table:
id num
-------------------
1 1
2 1
3 1
4 2
5 2
6 1
输出:(至少出现2次)
num times
--------------
1 3
2 2
我会用间隙和孤岛技术来解决这个问题:
select num, max(cnt)
from (
select num, count(*) cnt
from (
select
id,
num,
row_number() over(order by id) rn1,
row_number() over(partition by num order by id) rn2
from mytable
) t
group by num, rn1 - rn2
) t
group by num
最内层查询计算整个 table 和 num
组内的行号;行号之间的差异为您提供了每条记录所属的一组相邻记录(您可以 运行 独立地进行子查询并了解差异如何演变以了解更多信息)。
然后,下一级统计每组相邻记录的记录数。最外层查询为每个 num
.
获取最大相邻记录数
num | (No column name)
--: | ---------------:
1 | 3
2 | 2
根据评论中定义的添加逻辑,这就是您所追求的:
WITH YourTable AS(
SELECT V.id,
V.num
FROM (VALUES(1,1),
(2,1),
(3,1),
(4,2),
(5,2),
(6,1),
(7,1))V(id,num)), --Added extra row due to logic defined in comments
Grps AS(
SELECT YT.id,
YT.num,
ROW_NUMBER() OVER (ORDER BY id) -
ROW_NUMBER() OVER (PARTITION BY Num ORDER BY id) AS Grp
FROM YourTable YT),
Counts AS(
SELECT num,
COUNT(num) AS Times
FROM grps
GROUP BY grp,
num)
SELECT num,
MAX(times) AS times
FROM Counts
GROUP BY num;
这使用 CTE 和 ROW_NUMBER
来定义组,然后使用额外的 CTE 来获得每个组的 COUNT
。最后你可以获得 MAX
COUNT
每个 num
.
this will work for you
select num,count(num) times from Tabl
group by num
来源table:
id num
-------------------
1 1
2 1
3 1
4 2
5 2
6 1
输出:(至少出现2次)
num times
--------------
1 3
2 2
我会用间隙和孤岛技术来解决这个问题:
select num, max(cnt)
from (
select num, count(*) cnt
from (
select
id,
num,
row_number() over(order by id) rn1,
row_number() over(partition by num order by id) rn2
from mytable
) t
group by num, rn1 - rn2
) t
group by num
最内层查询计算整个 table 和 num
组内的行号;行号之间的差异为您提供了每条记录所属的一组相邻记录(您可以 运行 独立地进行子查询并了解差异如何演变以了解更多信息)。
然后,下一级统计每组相邻记录的记录数。最外层查询为每个 num
.
num | (No column name) --: | ---------------: 1 | 3 2 | 2
根据评论中定义的添加逻辑,这就是您所追求的:
WITH YourTable AS(
SELECT V.id,
V.num
FROM (VALUES(1,1),
(2,1),
(3,1),
(4,2),
(5,2),
(6,1),
(7,1))V(id,num)), --Added extra row due to logic defined in comments
Grps AS(
SELECT YT.id,
YT.num,
ROW_NUMBER() OVER (ORDER BY id) -
ROW_NUMBER() OVER (PARTITION BY Num ORDER BY id) AS Grp
FROM YourTable YT),
Counts AS(
SELECT num,
COUNT(num) AS Times
FROM grps
GROUP BY grp,
num)
SELECT num,
MAX(times) AS times
FROM Counts
GROUP BY num;
这使用 CTE 和 ROW_NUMBER
来定义组,然后使用额外的 CTE 来获得每个组的 COUNT
。最后你可以获得 MAX
COUNT
每个 num
.
this will work for you
select num,count(num) times from Tabl
group by num