Postgresql 如何从postgres分组集查询中删除空值

Postgresql 如何从postgres分组集查询中删除空值,postgresql,null,grouping-sets,Postgresql,Null,Grouping Sets,我想在一个查询中执行多个独立的分组,以便在一个查询中获得不同列的分组计数。 我使用以下示例查询实现了这一点: SELECT model, count(model), os_version,count(os_version), timezone, count(timezone) FROM device GROUP BY GROUPING SETS( (model),(os_version),(timezone) ); 查询的示例结果如下所示: "model" : "

我想在一个查询中执行多个独立的分组,以便在一个查询中获得不同列的分组计数。 我使用以下示例查询实现了这一点:

SELECT  model, count(model), os_version,count(os_version), timezone, count(timezone)
FROM device
GROUP BY
GROUPING SETS(
(model),(os_version),(timezone)
);
查询的示例结果如下所示:

"model" : "model A", "count" : 14, "os_version" : null, "count" : 14, "timezone" : null, "count" : 14
"model" : "model B", "count" : 6, "os_version" : null, "count" : 6, "timezone" : null, "count" : 6
"model" : null, "count" : 12, "os_version" : "Win 10", "count" : 12, "timezone" : null, "count" : 12
"model" : null, "count" : 8, "os_version" : "Mac OS", "count" : 8, "timezone" : null, "count" : 8
"model" : null, "count" : 5, "os_version" : null, "count" : 5, "timezone" : "GMT", "count" : 5
"model" : null, "count" : 15, "os_version" : null, "count" : 15, "timezone" : "EST", "count" : 15
从结果中,您可以看到它首先在
model
列上按分组,然后是
os\u version
,然后是
timezone
。 但在此过程中,它还为当前未进行分组的列引入空值

我想知道是否有任何方法可以在没有任何空值的情况下获得结果,而无需编写任何自定义解析器。例如,我期望的目标结果是:

"model" : "model A","count" : 14,
"model" : "model B", "count" : 6,
"os_version" : "Win 10", "count" : 12,
"os_version" : "Mac OS", "count" : 8,
"timezone" : "GMT", "count" : 5,
"timezone" : "EST", "count" : 15

可以使用外部查询包装查询:

SELECT CASE WHEN model      IS NOT NULL THEN 'model'
            WHEN os_version IS NOT NULL THEN 'os_version'
            WHEN timezone   IS NOT NULL THEN 'timezone'
       END AS category,
       coalesce(model, os_version, timezone) AS value,
       count
FROM (SELECT model, os_version, timezone, count(*)
      FROM device
      GROUP BY GROUPING SETS ((model),(os_version),(timezone))
     ) AS q;

非常感谢你的回答!我的问题解决了!非常感谢您的帮助。您可以添加一个WHERE子句,例如(仅示例)“SELECT…WHERE(os|U版本| |时区)NOTNULL”在这些括号之间插入所有可能为空的字段。如果串联(a | | b)中的任何列为null,则结果将为null。