как найти номер имеет более двух последовательных появлений? - PullRequest
0 голосов
/ 17 января 2020

Исходная таблица:

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

Вывод: (появляются не менее 2 раз)

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

Ответы [ 3 ]

3 голосов
/ 17 января 2020

На основании логики добавления c, определенной в комментариях, кажется, что вы ищете:

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.

2 голосов
/ 17 января 2020

Я бы обратился к этому с помощью метода пробелов и островков:

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.

Демонстрация на DB Fiddle :

num | (No column name)
--: | ---------------:
  1 |                3
  2 |                2
0 голосов
/ 17 января 2020

это будет работать для вас

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