SQL - 在特定条件下从多行中仅选择一个值
Posted
技术标签:
【中文标题】SQL - 在特定条件下从多行中仅选择一个值【英文标题】:SQL - select only one value from multiple rows under certain condition 【发布时间】:2021-11-19 15:05:16 【问题描述】:大家好,我正在尝试解决这个问题,因为我在互联网上研究了几个小时,但找不到任何解决方案。 我有一张像这样的桌子:
Number | Language | Name |
---|---|---|
1111 | D | German name for 1111 |
1111 | E | English name for 1111 |
1111 | S | Spanish name for 1111 |
2222 | D | German name for 2222 |
3333 | S | Spanish name for 3333 |
逻辑应该是,对于每个数字:
如果 Language = E 可用,则返回英文名称。 如果 E 不可用,D 可用,则返回德语名称。 如果 E 和 D 不可用,则返回“名称不可用”所以结果表应该是这样的:
Number | Name |
---|---|
1111 | English name for 1111 |
2222 | German name for 2222 |
3333 | name not available |
【问题讨论】:
【参考方案1】:使用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;
【讨论】:
嗨 Lukasz,这完美地解决了我的问题!非常感谢您的快速回答和解决方案的详细说明:)以上是关于SQL - 在特定条件下从多行中仅选择一个值的主要内容,如果未能解决你的问题,请参考以下文章