【问题标题】:SQL: Group by multiple columns and select first non null values for remaining multiple columnsSQL:按多列分组并为剩余的多列选择第一个非空值
【发布时间】:2022-10-09 16:04:11
【问题描述】:

当左表作为输入时,如何获得右表作为输出。我想按 prod 和 geo 列分组,并为所有规则列获取第一个非空值。

我试过这种方法:

SELECT prod, geo,
(SELECT rule_1 FROM temp WHERE rule_1 IS NOT NULL LIMIT 1) as rule_1,
(SELECT rule_2 FROM temp WHERE rule_2 IS NOT NULL LIMIT 1) as rule_2,
(SELECT rule_3 FROM temp WHERE rule_3 IS NOT NULL LIMIT 1) as rule_3,
(SELECT rule_4 FROM temp WHERE rule_4 IS NOT NULL LIMIT 1) as rule_4
FROM temp
GROUP BY prod, geo

但不知何故,这仅适用于第一个产品地理组合,不适用于后续组合

【问题讨论】:

  • 这不是免费的代码/脚本编写服务,而是针对特定编程相关问题的问答网站。因此,您必须先自己尝试,当遇到困难时,请回到这里,编辑您的问题并提供您的编码尝试的最小可重复示例:stackoverflow.com/help/minimal-reproducible-example 请参观并阅读如何提问:stackoverflow.com/help/how-to-ask
  • 我已经添加了我尝试过的代码。您能否为现有代码提出一些新方法以解决我面临的问题。

标签: sql


【解决方案1】:

Alias the table in your query and update the filter 在子查询中排除不属于当前组的记录。

SELECT prod,
       geo,

  (SELECT rule_1
   FROM test
   WHERE rule_1 IS NOT NULL
     -- exclude records not of the current grouping
     AND t.prod = test.prod
     AND t.geo = test.geo
   LIMIT 1) AS rule_1,

  (SELECT rule_2
   FROM test
   WHERE rule_2 IS NOT NULL
     AND t.prod = test.prod
     AND t.geo = test.geo
   LIMIT 1) AS rule_2,

  (SELECT rule_3
   FROM test
   WHERE rule_3 IS NOT NULL
     AND t.prod = test.prod
     AND t.geo = test.geo
   LIMIT 1) AS rule_3,

  (SELECT rule_4
   FROM test
   WHERE rule_4 IS NOT NULL
     AND t.prod = test.prod
     AND t.geo = test.geo
   LIMIT 1) AS rule_4
FROM test AS t -- alias the table.
GROUP BY prod,
         geo;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多