按 2 列对表进行分组并优先考虑非空值?

Posted

技术标签:

【中文标题】按 2 列对表进行分组并优先考虑非空值?【英文标题】:Group a Table by 2 columns and give priority to not null value? 【发布时间】:2021-07-30 08:29:15 【问题描述】:

我只能访问数据库,无法更改结果的存储方式。

我们有一张这样的桌子

UserID, Gender, Category

'f2', NULL,  '2'
'f2', 'female',  '2'
'05', 'male',  '2'
'06', 'female',  '2'
'ee', 'female',  '2'
'bd', NULL,  '2'
'dd', NULL,  '2'
'01', NULL,  '2'

这是我现在使用的查询

SELECT 
    gender,
    count(*) count
FROM
    user_history
WHERE
    1
    AND GROUP BY UserID, Gender,Category

这给了我错误的结果,因为它正在合并而没有优先考虑性别列(删除了性别的 f2)

我怎样才能得到类似的结果?预期输出:

性别统计

female  3     (f2,06,ee)
male    1     (only 05 is there)
unknown 3     (f2 has duplicate entries and one of the row has a gender, so I've to give priority to that)

【问题讨论】:

你需要统计性别吗? 是的,我也需要空性别(未知)的计数 您当前和预期的输出是什么?你能描述清楚吗? '我怎样才能得到类似的结果?'在该行下方,我添加了预期的输出 【参考方案1】:

您可以使用 2 级聚合来做到这一点:

SELECT COALESCE(Gender, 'Unknown') Gender, 
       COUNT(*) counter
FROM (
  SELECT UserID, MAX(Gender) Gender
  FROM user_history
  GROUP BY UserID
) t
GROUP BY Gender

或者如果您还想按Category 分组:

SELECT COALESCE(Gender, 'Unknown') Gender, 
       COUNT(*) counter,
       Category
FROM (
  SELECT UserID, MAX(Gender) Gender, Category
  FROM user_history
  GROUP BY UserID, Category
) t
GROUP BY Gender, Category

请参阅demo。

【讨论】:

以上是关于按 2 列对表进行分组并优先考虑非空值?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres - 从多个有序行中选择非空白非空值

聚合函数数据分组

分组日期滚动中最新非空值的 Pandas 日期索引

行按名称分组并获取空值

MySQL在分组后获得第一个非空值

Mysql - 转换非空值第 2 部分