подсчитать последовательные строки в mysql - PullRequest
0 голосов
/ 06 мая 2020

Я хочу найти здесь идентификаторы с последовательным 1, встречающимся 3 или более раз. Таким образом, на выходе я увижу только 5,6,7,8. Может ли кто-нибудь помочь мне с запросом здесь ??

+------+----------+
| id   | diff_chk |
+------+----------+
|    2 |        1 |
|    3 |        2 |
|    5 |        1 |
|    6 |        1 |
|    7 |        1 |
|    8 |        1 |
|    9 |        3 |
|   12 |        1 |
|   13 |        1 |
+------+----------

Ожидаемый результат;

id
5
6
7
8

Запрос, который я пытался использовать, не дает мне правильных результатов. Я использовал ниже logi c.

 select id,COUNT(1) OVER( PARTITION BY diff_chk ORDER BY id ) as w_func from table1 where w_func!=1

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Предполагая, что версия MySQL 8+, вы можете использовать

WITH
cte1 AS ( SELECT id, 
                 diff_chk,
                 id - ROW_NUMBER() OVER (ORDER BY id) group_num
          FROM test 
          WHERE diff_chk = 1 ),
cte2 as ( SELECT id, 
                 diff_chk,
                 COUNT(*) OVER (PARTITION BY group_num) group_count
          FROM cte1 )
SELECT id
FROM cte2
WHERE group_count >= 3;

fiddle

0 голосов
/ 06 мая 2020

Используйте CTE, который возвращает группы последовательных 1 s:

with cte as (
  select *, sum(diff_chk <> 1) over (order by id) grp
  from tablename    
)  
select id
from cte
where diff_chk = 1
  and grp in (select grp from cte where diff_chk = 1 group by grp having count(*) >= 3)

См. demo . Результатов:

| id  |
| --- |
| 5   |
| 6   |
| 7   |
| 8   |
0 голосов
/ 06 мая 2020

Это проблема пробелов и островов . Попробуйте следующее, и вот демонстрация в MySql 8.0.

select
    id
from
(   
  select
        diff_chck,
        id,
        count(*) over (partition by diff_chck, rnk) as total
    from
    (
        select
            diff_chck,
            id,
            id - row_number() over (partition by diff_chck order by id) as rnk
        from myTable
    ) t
) vals
where total > 2

order by
    id

Вывод:

*-----*
| id  |
*-----*
| 5   |
| 6   |
| 7   |
| 8   |
*-----*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...