【问题标题】:How to find count of multiple columns in sql group by id?如何通过id查找sql​​组中多列的计数?
【发布时间】:2018-01-22 05:58:03
【问题描述】:

我有一个表,其架构如下:

root
|id
|name
|col1
|col2
|...
|col30

条件是多行可以具有相同的名称(它们不是主键 - 键是 ID)。 col1-col30 中的值将是某个字符串,也可以是字符串“null”。

我对每个名称填写的列数感兴趣。

例如,

如果名称“test1”在一行中填写了col1-5,另一行填写了“test1”并填写了col1, 3, 10, 6(其余未填写的列只是字符串值“null”) , "test1" 的值应该是 9。 我对 SQL 很陌生,一直在寻找这个。请帮忙。

【问题讨论】:

  • 因此,如果相同的名称多次填充相同的列,您将它们全部加起来吗?重要的是填了哪些?
  • 样本数据真的很有帮助。您还需要意识到 SQL 表表示 unordered 集,因此除非列指定它,否则没有排序。我还删除了不兼容的数据库标签。请仅使用您真正使用的数据库进行标记。
  • @PatrickArtner 是的,如果名称相同,则将它们全部加起来。填哪个都无所谓
  • @GordonLinoff Argh 我正在尝试使用 spark sql 执行此操作,所以不知道我将使用哪个数据库。我认为他们确实采用 postgresql 或 ansi sql 格式

标签: sql apache-spark-sql


【解决方案1】:

试试这个:

SELECT 
    name,
    CASE WHEN col1_max IS NOT NULL THEN 1 ELSE 0 END + -- Only include non-NULL values
    CASE WHEN col2_max IS NOT NULL THEN 1 ELSE 0 END
FROM (
    SELECT
        name,
        MAX(col1) AS col1_max, -- Non-NULL values come before NULL
        MAX(col2) AS col2_max
    FROM MyTable
    GROUP BY name
) src

您可以添加更多其余列以适合您的情况。

更新
我刚刚意识到您的 NULL 案例带有“null”字符串。修改:

SELECT 
    name,
    CASE WHEN col1_max IS NOT NULL THEN 1 ELSE 0 END + -- Only include non-NULL values
    CASE WHEN col2_max IS NOT NULL THEN 1 ELSE 0 END
FROM (
    SELECT
        name,
        MAX(CASE WHEN col1 = 'null' THEN NULL ELSE col1 END) AS col1_max, -- Non-NULL values come before NULL
        MAX(CASE WHEN col2 = 'null' THEN NULL ELSE col2 END) AS col2_max
    FROM MyTable
    GROUP BY name
) src

【讨论】:

  • 括号末尾的 src 是什么?
  • src 只是括号中的表表达式/派生查询的别名。如果您选择/加入多个表并需要限定列名,这将非常有用。在这种只有一张表的情况下,除了有正确的语法之外没有什么用处:)
  • 啊,我明白了。我认为这可以工作,但我认为我需要总结所有情况下的子句.. 否?
  • 是的,不需要在查询的两个位置添加其余的 col3, col4...col30 列。
【解决方案2】:

首先你 unpivot 你的表并计算那些具有 not null 值的行。在postgres 中,您可以使用unnest 实现此目的。我只使用了col1..7——在你的情况下改为col30

WITH t AS(
SELECT id,name,
       unnest(array['col1', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7']) AS colname,
       unnest(array[col1, col2, col3, col4, col5, col6, col7]) AS colvalue       
FROM your_table)
SELECT id, name, 
    SUM(CASE WHEN colvalue IS NULL THEN 0 ELSE 1 END) AS count_filled
FROM t
GROUP BY 1,2;

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2016-12-26
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多