Postgres:按两列分组 - group by包括所有唯一组合,0表示空值

时间:2018-01-29 06:08:18

标签: sql postgresql group-by

我有一个名为case的表,如下所示

0.5*match_parent

我想要一个如下所示的输出:

os      device      event_time
Android     Mobile      <Tstamp>
Android     Tablet      <Tstamp>
Windows     PC          <Tstamp>
Linux       PC          <Tstamp>

原始表格不包含任何带有(Android,PC),(Windows,Mobile)等组合的行,但我寻求输出使这些行的计数为零。通过查询的正常组不会给我那些可能因为原始表根本没有这些组合。

os         device    events_count
Android    Mobile      10
Android    Tablet      22
Android    PC          0
Windows    Mobile      0
Windows    Tablet      0
Windows    PC          40
Linux      Mobile      0
Linux      Tablet      0
Linux      PC          21

2 个答案:

答案 0 :(得分:2)

首先选择所有OS /设备组合,然后再次外连接您的表:

select o.os, d.device, count(e.events_count)
from (select distinct os from events) o
cross join (select distinct device from events) d
left join events e on e.os = o.os and e.device = d.device
group by o.os, d.device
order by o.os, d.device;

(对于此类数据,您通常会有一个操作系统表和一个设备表。您可以交叉连接这些数据,然后外部加入您的事件表。)

答案 1 :(得分:1)

我会使用cross join

select t.os, t.device, count(c.os)
from 
(
  select os, device
  from
  (
    select distinct os from cases
  ) t1
  cross join 
  (
    select distinct device from cases
  ) t2
) t 
left join cases c on t.os = c.os and 
                     t.device = c.device
group by t.os, t.device