如何根据列中的值使一行出现多次?
How to make a row appear several times depending on a value in a column?
我正在为有资格赢得抽奖的用户创建数据集。所有注册用户都有资格,但是高级用户获得 2 张门票而不是 1 张。如果我有如下 table:
user_id type
16234 premium
19273 regular
13846 regular
22343 regular
28820 premium
如何打印:
user_id
16234
16234
19273
13846
22343
28820
28820
你可以select全部,然后合并高级用户:
(select user_id from my_table) union all
(select user_id from my_table where type='premium')
这是一种"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 张,这将更容易实现。
我正在为有资格赢得抽奖的用户创建数据集。所有注册用户都有资格,但是高级用户获得 2 张门票而不是 1 张。如果我有如下 table:
user_id type
16234 premium
19273 regular
13846 regular
22343 regular
28820 premium
如何打印:
user_id
16234
16234
19273
13846
22343
28820
28820
你可以select全部,然后合并高级用户:
(select user_id from my_table) union all
(select user_id from my_table where type='premium')
这是一种"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 张,这将更容易实现。