使用ARRAY_AGG:
WITH cte(Number, LANGUAGE, Name) AS (
SELECT 1111, 'D', 'German name for 1111' UNION ALL
SELECT 1111, 'E', 'English name for 1111' UNION ALL
SELECT 1111, 'S', 'Spanish name for 1111' UNION ALL
SELECT 2222, 'D', 'German name for 2222' UNION ALL
SELECT 3333, 'S', 'Spanish name for 3333'
)
SELECT Number,
(ARRAY_AGG(IFF(LANGUAGE IN ('D','E'), NAME, 'name not available'))
WITHIN GROUP(ORDER BY DECODE(LANGUAGE,'E',0,'D',1,2)))[0]::TEXT AS name
FROM cte
GROUP BY Number
ORDER BY Number;
输出:
它是如何工作的:
IFF(LANGUAGE IN ('D','E'), NAME, 'name not available') - 只允许“D”和“E”
DECODE(LANGUAGE,'E',0,'D',1,2)) - 排序顺序,“E”第一,“D”第二
相关:Equivalent for Keep in Snowflake
或者使用QUALIFY:
WITH cte(Number, LANGUAGE, Name) AS (
SELECT 1111, 'D', 'German name for 1111' UNION ALL
SELECT 1111, 'E', 'English name for 1111' UNION ALL
SELECT 1111, 'S', 'Spanish name for 1111' UNION ALL
SELECT 2222, 'D', 'German name for 2222' UNION ALL
SELECT 3333, 'S', 'Spanish name for 3333'
)
SELECT Number,
CASE WHEN LANGUAGE IN ('E','D') THEN NAME ELSE 'name not available' END AS Name
FROM cte
QUALIFY ROW_NUMBER() OVER(PARTITION BY Number
ORDER BY DECODE(LANGUAGE,'E',0,'D',1,2)) = 1
ORDER BY Number;