Пропустить следующую координату - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть таблица foo, где x, y представляет координаты
Как отменить ближайшую следующую координату при использовании 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

Здесь кординаты (32,11), (32,16), (33,22) были пропущены, поскольку они имеют непосредственную предыдущую координату (32,10) -> (32,11), (32,15) -> (32,16), (33,21) -> (33,22)

Возможно ли это используя запрос?
Я использую Postgres

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Вы можете использовать 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;

В Postgres вы также можете написать where как:

where prev_y is distinct from y - 1
1 голос
/ 16 апреля 2020

Вы можете использовать row_number():

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

Редактировать: После проверки вопроса вы можете использовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...