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 - 在特定条件下从多行中仅选择一个值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 排除特定类型的多行选择精确的两行

MySQL 根据特定字段值和行数选择多行

sql怎么用查询结果作为条件进行查询

SQL如何根据多行中的值选择行

SQL / Hive 选择具有特定列值的第一行

在其他表的多行中选择有条件的行