返回postgresql中多列中的非重复计数

时间:2015-02-02 19:14:27

标签: sql postgresql

我有一张桌子,需要返回不同的数据及其数量。我在2个不同的栏目上这样做,但从那以后就没有遇到任何运气。这是我想要做的一个例子。

╔════════╦════════════╦══════╦═════════════╗
║  Fog   ║ Count(fog) ║ Snow ║ Count(snow) ║
╠════════╬════════════╬══════╬═════════════╣
║ LA01   ║       1123 ║ NWC  ║         109 ║
║ SIU    ║       3665 ║ SIS  ║          64 ║
║ CHARTN ║        444 ║ PHS  ║         120 ║
╚════════╩════════════╩══════╩═════════════╝

我尝试过此查询但确实有效

SELECT fog, count(fog), snow, count(snow) FROM message
WHERE arrival_timestamp >= (now() - '48 hour'::INTERVAL) GROUP BY fog, snow

当我尝试这个时,我对2个不正确的计数有相同的值。

1 个答案:

答案 0 :(得分:0)

您想要做的事情需要一些工作,因为每行的内容是独立的。在Postgres中,您可以使用full outer joinrow_number()

执行此操作
select f.fog, f.cnt, s.snow, s.cnt
from (select fog, count(*) as cnt,
             row_number() over (order by count(*) desc) as seqnum
      from message
      where arrival_timestamp >= (now() - '48 hour'::INTERVAL)
      group by fog
     ) f full outer join
     (select snow, count(*) as cnt,
             row_number() over (order by count(*) desc) as seqnum
      from message
      where arrival_timestamp >= (now() - '48 hour'::INTERVAL)
      group by snow
     ) s
     on f.seqnum = s.seqnum;

这是按照最高计数排序的 - 在样本结果中不是这种情况。