2

我需要在 PostgreSQL 9.1 的一个查询中获取每小时不同名称的计数

我的表中的相关列(针对问题进行了概括)是:

occurred timestamp with time zone and
name character varying(250) 

为了这个问题,表名只是table

时间戳都将occurred在一天的午夜到午夜(不包括)范围内。到目前为止,我的查询看起来像:

'SELECT COUNT(DISTINCT ON (name)) FROM table'

如果我可以将输出格式化为 24 个整数的列表(一天中的每个小时一个),那将是很好的,不需要返回名称。

4

3 回答 3

3
SELECT date_trunc('hour', occurred) AS hour_slice
      ,count(DISTINCT name) AS name_ct
FROM   mytable
GROUP  BY 1
ORDER  BY 1;

DISTINCT ON是一个不同的功能。

date_trunc()为您提供每个不同小时的总和,而EXTRACT在较长时间内为您提供每天每小时的总和。这两个结果不相加,因为相加的倍数count(DISTINCT x)等于或大于count(DISTINCT x)

于 2012-07-18T15:53:27.760 回答
3

如果我正确理解你想要什么,你可以写:

SELECT EXTRACT(HOUR FROM occurred),
       COUNT(DISTINCT name)
  FROM ...
 WHERE ...
 GROUP
    BY EXTRACT(HOUR FROM occurred)
 ORDER
    BY EXTRACT(HOUR FROM occurred)
;
于 2012-07-18T15:54:17.967 回答
2

您希望按小时计算:

select extract(hour from occurred) as hr, count(distinct name)
from table t
group by extract(hour from occurred)
order by 1

这假设只有一天的数据。否则,将合并不同日期的小时数。为了解决这个问题,您还需要包含日期信息。

于 2012-07-18T15:55:41.813 回答