【问题标题】:how to find the number has more than two consecutive appearences?如何找到连续出现两次以上的号码?
【发布时间】:2020-01-17 10:57:20
【问题描述】:

源表:

id     num
-------------------
1       1
2       1
3       1
4       2
5       2
6       1

输出:(至少出现2次)

num   times
--------------
1      3
2      2

【问题讨论】:

  • 如果添加第 (7,1) 行,预期的结果是什么?
  • times 应该是 num 出现的最大次数
  • @user618520 。 . .如果id 有空缺怎么办?
  • id目前没有空缺,感谢您的考虑。

标签: sql sql-server tsql window-functions gaps-and-islands


【解决方案1】:

根据 cmets 中定义的添加逻辑,这似乎是您所追求的:

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。最后,您可以通过num 获得MAX COUNT。

【讨论】:

  • 我不知道谁对此投了反对票,但它确实有效,所以我会调整并投票赞成。
【解决方案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

最内部的查询计算整个表和num 组内的行号;行号之间的差异为您提供了每条记录所属的相邻记录组(您可以独立运行该子查询并跟踪差异如何演变以了解更多信息)。

然后,下一级统计每组相邻记录中的记录数。最外层查询获取每个num 中相邻记录的最大计数。

Demo on DB Fiddle:

编号 | (无列名) --: | ---------------: 1 | 3 2 | 2

【讨论】:

    【解决方案3】:

    这对你有用

    select num,count(num) times from Tabl
    group by num
    

    【讨论】:

    • 嗨@MohammadShehroz,不,它不会工作。在此处检查:dbfiddle.uk/… 您的查询是第一个与结果一起的查询,在您的查询下是来自 GMB 的有效...
    • 你好这个查询工作正常你可以检查dbfiddle.uk/…
    • 正如我在小提琴中向您展示的那样,它没有。请分析数据。小提琴的结果应该是 1|3 和 2|2。请检查此问题的 cmets,以更好地了解 OP(原始海报)想要什么。另外,我不是那个投反对票的人,但现在我会......干杯!
    • @MohammadShehroz 不,你会得到一个4 times 1,但问题是关于按 id 列排序的连续出现...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多