我一直在寻找解决这个问题的方法,但仍然找不到最类似于SQL Group BY COLUMN Choose specific rows的问题。
这是我的问题
Type_Table
column1 | column2
a | s
a | m
a | e
b | s
b | e
c | m
c | s
所以基本上我想按column1分组,但只选择column2 = e中的值,但是如果它不存在于column1中的重复值中,则选择column2 = s,但如果它不存在于重复值column1中然后选择column2 = m。 所以结果表看起来像这样
column1 | column2
a | e
b | e
c | s
我用过这个
select column1,case when column2=e then e when column2=s then s when column2=m then m end column2 from type_table group by 1
,但这显然行不通。我需要的是按列1分组,对于列2中的每个不同值,如果它们各自的列1值均存在,则仅选择e;如果e不存在,则选择s;如果s不存在,则选择m。
感谢您的回答
答案 0 :(得分:1)
一种方法使用row_number()
:
select t.*
from (select t.*,
row_number() over (partition by col1
order by (case col2 when 'e' then 1 when 's' then 2 when 'm' then 3 else 4 end)
) as seqnum
from t
) t
where seqnum = 1;
答案 1 :(得分:0)
下面是BigQuery样式(使用标准SQL)
#standardSQL
SELECT
column1,
ARRAY_AGG(column2 ORDER BY STRPOS('mse', column2) DESC LIMIT 1)[OFFSET(0)] column2
FROM `project.dataset.table`
GROUP BY column1
您可以使用问题中的示例数据来测试,玩游戏,如下例所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'a' column1, 's' column2 UNION ALL
SELECT 'a', 'm' UNION ALL
SELECT 'a', 'e' UNION ALL
SELECT 'b', 's' UNION ALL
SELECT 'b', 'e' UNION ALL
SELECT 'c', 'm' UNION ALL
SELECT 'c', 's'
)
SELECT
column1,
ARRAY_AGG(column2 ORDER BY STRPOS('mse', column2) DESC LIMIT 1)[OFFSET(0)] column2
FROM `project.dataset.table`
GROUP BY column1
-- ORDER BY column1
有结果
Row column1 column2
1 a e
2 b e
3 c s