Как сделать так, чтобы строка появлялась несколько раз в зависимости от значения в столбце?
Я создаю набор данных для пользователей, имеющих право выиграть лотерею. Все зарегистрированные пользователи имеют право на участие, однако премиум-пользователи получают 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')