SQL: получение отсутствующих значений из надмножества

У меня есть такая таблица:

Device  | Rating
-----------------
iPhone  | 1
iPhone  | 2
iPhone  | 4
iPhone  | 5
Android | 3
Android | 5

Я хочу вернуть таблицу со всеми возможными рейтингами. В этом случае 1 to 5. Итак, моя результирующая таблица будет:

Device  | Rating
-----------------
iPhone  | 1
iPhone  | 2
iPhone  | 3
iPhone  | 4
iPhone  | 5
Android | 1
Android | 2
Android | 3
Android | 4
Android | 5

Я пытался использовать что-то вроде:

SELECT a.device, b.rating
FROM device_rating_table a
RIGHT JOIN rating_lookup_table b
ON a.rating = b.rating
GROUP BY 1,2
;

но это не работает. Не могли бы вы предложить решение для этого?

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете cross join список отдельных устройств с номерами от 1 до 5:

select d.device, r.rating
from (select distinct device from mytable) d
cross join generate_series(1, 5) as r(rating)

Или, если вы хотите сгенерировать диапазон рейтинга из минимальных и максимальных значений, которые есть в таблице:

select d.device, r.rating
from (select distinct device from mytable) d
cross join (select generate_series(min(rating), max(rating)) from mytable) as r(rating)

Наконец: если все рейтинги уже есть в таблице, не нужно использовать generate_series():

select d.device, r.rating
from (select distinct device from mytable) d
cross join (select distinct rating from mytable) r

Восхитительно как всегда! Спасибо! Могу я еще немного поковыряться в твоем мозгу? Есть ли альтернатива перекрестному соединению или рекурсивному cte? Спрашиваю, потому что мои фактические данные составляют> 10 миллионов строк.

Garfield 15.12.2020 02:28

Вы можете использовать with recursive:

with recursive cte as (
  select distinct device d, 1 r from devices
  union all
  select d, r + 1 from cte where r < 5
)
select * from cte order by d asc;

Другие вопросы по теме