Je veux trouver les identifiants ici avec le 1 consécutif se produisant 3 fois ou plus. Donc, dans la sortie, je ne verrai que 5,6,7,8. Quelqu'un peut-il m'aider avec la requête ici ??

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

Production attendue;

id
5
6
7
8

La requête que j'ai essayé d'utiliser ne me récupère pas les résultats corrects J'ai utilisé la logique ci-dessous.

 select id,COUNT(1) OVER( PARTITION BY diff_chk ORDER BY id ) as w_func from table1 where w_func!=1
-1
user7422128 6 mai 2020 à 08:23

3 réponses

Meilleure réponse

Il s'agit de lacunes et îles problème. Essayez ce qui suit et voici la démo dans 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

Production:

*-----*
| id  |
*-----*
| 5   |
| 6   |
| 7   |
| 8   |
*-----*
0
zealous 6 mai 2020 à 06:24

Utilisez un CTE qui renvoie les groupes de 1 consécutifs:

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)

Voir la démo.
Résultats:

| id  |
| --- |
| 5   |
| 6   |
| 7   |
| 8   |
0
forpas 6 mai 2020 à 06:10

En supposant que la version MySQL est 8+, vous pouvez utiliser

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;

violon

0
Akina 6 mai 2020 à 06:00