【问题标题】:SQL - select only one value from multiple rows under certain conditionSQL - 在特定条件下从多行中仅选择一个值
【发布时间】:2023-04-04 07:50:01
【问题描述】:


大家好,我正在尝试解决这个问题,因为我在互联网上研究了几个小时,但找不到任何解决方案。
我有一张像这样的桌子:

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

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案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,这完美地解决了我的问题!非常感谢您的快速回答和解决方案的详细说明:)
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多