J'ai une table foox, y représente les coordonnées
Comment supprimer la coordonnée suivante immédiate en utilisant select?

  x   |  y | value 
------+-----+-------
   32 | 10 |     7
   32 | 11 |     2
   32 | 15 |     2
   32 | 16 |     5
   32 | 21 |    25
   33 | 17 |    57
   33 | 21 |    83
   33 | 22 |    86

Output

  x   |  y | value 
------+-----+-------
   32 | 10 |     7
   32 | 15 |     2
   32 | 21 |    25
   33 | 17 |    57
   33 | 21 |    83

Ici, les coordonnées (32,11), (32,16), (33,22) ont été ignorées car elles ont une coordonnée précédente immédiate (32,10) -> (32,11), (32,15) -> (32,16), (33,21) -> (33,22)

Est-ce possible en utilisant une requête?
J'utilise Postgres

0
saintlyzero 16 avril 2020 à 11:47

2 réponses

Meilleure réponse

Vous pouvez utiliser row_number():

select *
from (select t.*, row_number() over (order by x, y) % 2 as seq
      from table t
     ) t
where seq = 1;

Modifier: après avoir revérifié la question, vous pouvez utiliser lag():

select t.x, t.y, t.value
from (select t.*, 
             y - lag(y) over (partition by x order by y) as prev_val
      from table t
     )  t
where (t.prev_val is null or t.prev_val > 1);
1
Yogesh Sharma 16 avril 2020 à 13:59

Vous pouvez utiliser lag():

select t.*
from (select t.*,
             lag(y) over (partition by x order by y) as prev_y
      from t
     ) t
where prev_y is null or prev_y = y - 1;

Dans Postgres, vous pouvez également exprimer le where comme suit:

where prev_y is distinct from y - 1
1
Gordon Linoff 16 avril 2020 à 11:22