Найдите отсутствующее число из последовательности для каждого значения в улье - PullRequest
1 голос
/ 09 мая 2020

У меня есть таблица, как показано ниже -

User-id  |  sequence
1   0
1   1
1   2
2   1
3   2

здесь 0 1 и 2 - фиксированная последовательность, которую пользователь может иметь максимум, теперь мне нужен флаг как N, где какая-либо последовательность отсутствует для пользователя иначе флаг должен быть Y, я могу сказать, что вывод должен иметь вид -

1   0  Y
1   1  Y
1   2  Y
2   0  N
2   1  Y
2   2  N
3   0  N
3   1  N
3   2  Y

1 Ответ

1 голос
/ 10 мая 2020

Выберите отдельный user_id, перекрестное соединение с последовательностью (0, 1, 2), чтобы получить все комбинации user + sequnce, левое соединение с вашей таблицей для вычисления флага

select us.user_id, 
       us.sequence,
       case when t.user_id is null then 'N' else 'Y' end flag
from
  (--all user sequence combinations
   select u.user_id, s.sequence
     from (select distinct user_id from mytable) u 
          cross join (select stack (3, 0, 1, 2) as sequence) s
  ) us --all user+sequence         
  left join mytable t on us.sequence=t.sequence and us.user_id=t.user_id
 order by us.user_id, us.sequence;

Демо с вашим пример данных:

with 
mytable as ( --use your table instead of this
select stack(5,
1, 0,
1, 1,
1, 2,
2, 1,
3, 2) as  (user_id,sequence)
)

select us.user_id, 
       us.sequence,
       case when t.user_id is null then 'N' else 'Y' end flag
from
(--all user sequence combinations
select u.user_id,
       s.sequence
  from (select distinct user_id from mytable) u 
       cross join (select stack (3, 0, 1, 2) as sequence) s
) us --all user+sequence         
 left join mytable t on us.sequence=t.sequence and us.user_id=t.user_id
  order by us.user_id, us.sequence;

Результат:

user_id sequence flag
1   0   Y
1   1   Y
1   2   Y
2   0   N
2   1   Y
2   2   N
3   0   N
3   1   N
3   2   Y
...