SQL находит строки с соседним номером - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть таблица, которая выглядит примерно так:

+----------+-------+
| position | group |
+----------+-------+
| 1        | a     |
+----------+-------+
| 5        | b     |
+----------+-------+
| 6        | b     |
+----------+-------+
| 7        | c     |
+----------+-------+
| 8        | b     |
+----------+-------+

Я хочу SELECT комбинаций строк, которые имеют смежные позиции в одной группе. Например, учитывая приведенную выше таблицу, результат запроса должен быть:

+----------+-------+
| position | group |
+----------+-------+
| 5        | b     |
+----------+-------+
| 6        | b     |
+----------+-------+

Производительность является проблемой, потому что в таблице 1,5 миллиарда строк, но положение и группа индексируются, поэтому она относительно быстрая. Любые предложения о том, как написать этот запрос? Я не уверен, с чего начать, потому что я не знаю, как написать оператор WHERE, который включает несколько строк вывода.

Ответы [ 3 ]

0 голосов
/ 04 ноября 2018

Я бы использовал подобъект так:

select * from mytable m1
where (select count(*) from mytable m2 where m2.position = m1.position + 1 and m2.group = m1.group) > 0
0 голосов
/ 04 ноября 2018

Просто используйте lag() и lead():

select t.*
from (select t.*,
             lag(group) over (order by position) as prev_group,
             lead(group) over (order by position) as next_group
      from t
     ) t
where prev_group = group or next_group = group;

Если под «смежным» вы конкретно подразумеваете, что позиция отличается на единицу (а не является ближайшим значением), то я бы выбрал exists:

select t.*
from t
where exists (select 1 from t t2 where t2.group = t.group and t2.position = t.position - 1) or
      exists (select 1 from t t2 where t2.group = t.group and t2.position = t.position + 1);
0 голосов
/ 04 ноября 2018
select distinct T1.position, T2.group from
T as T1
inner join
T as T2
on(T1.group=T2.group and t2.position=t1.position+1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...