Как сделать так, чтобы строка появлялась несколько раз в зависимости от значения в столбце?

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

user_id     type
16234       premium
19273       regular
13846       regular
22343       regular
28820       premium

Как мне его напечатать:

user_id
16234
16234
19273
13846
22343
28820
28820

2 ответа

Решение

Вот способ выражения логики в стиле BigQuery:

SELECT u_id
FROM (SELECT 16234 as user_id, 'premium' as type UNION ALL
      SELECT 19273, 'regular'
     ) t JOIN
     UNNEST(ARRAY[t.user_id, t.user_id]) u_id with offset n
     ON n = 1 or type = 'premium';

Или вот так:

SELECT t.user_id
FROM (SELECT 16234 as user_id, 'premium' as type UNION ALL
      SELECT 19273, 'regular'
     ) t CROSS JOIN
     UNNEST(GENERATE_ARRAY(1, (CASE WHEN type = 'premium' THEN 2 ELSE 1 END))) n;

Преимущество такого подхода перед чем-то вроде UNION ALLв том, что это довольно легко обобщается. Например, если премиум-пользователи получили 20 билетов, а постоянные - только 5, это было бы проще реализовать.

Вы можете выбрать всех, а затем объединить премиум-пользователей:

(select user_id from my_table) union all
(select user_id from my_table where type='premium') 
Другие вопросы по тегам