Sql 对列值的更改日期进行不同搜索
简短而简单,我想得到一个独特的小时和他们的计数代表列表Sql 对列值的更改日期进行不同搜索,sql,postgresql,datetime,count,Sql,Postgresql,Datetime,Count,简短而简单,我想得到一个独特的小时和他们的计数代表列表 SELECT DISTINCT(date_trunc('hour', occurred)) as time, COUNT(*) FROM log WHERE occurred BETWEEN '2014-01-01 00:00' AND '2014-01-01 23:59' GROUP BY occurred; 这不起作用,因为我得到的结果比24个多得多。 所以我继续尝试: SELECT DISTINCT(occurred), C
SELECT DISTINCT(date_trunc('hour', occurred)) as time, COUNT(*)
FROM log
WHERE occurred BETWEEN '2014-01-01 00:00' AND '2014-01-01 23:59'
GROUP BY occurred;
这不起作用,因为我得到的结果比24个多得多。所以我继续尝试:
SELECT DISTINCT(occurred), COUNT(*)
FROM log
WHERE occurred BETWEEN .. AND ..
GROUP BY date_trunc('hour', occurred);
这是一个无效的语法,很明显我只是在胡编乱造,因此我需要帮助。
如何解决这个问题呢?这里根本不需要
DISTINCT
如果您只是对发生任何事情的“小时”列表感兴趣(适用于任何时间范围):
generate_series()
左连接将保留所有连接。
只计算实际的日志条目。distinct
不是一个函数。它总是在结果的所有列上运行。我一直认为这是一个简单的版本,即在(发生的)发生时执行<代码>DISTINCT,…<代码>,我当时猜错了。@a_horse_没有名字,继续回答:<代码>选择DISTINCT on(time)date_trunc('hour',incident)作为时间,COUNT(*)根据发生在“2014-01-01 00:00”和“2014-01-01 23:59”之间的日志,由发生在“2014-01-01 00:00”和“2014-01-01 23:59”之间的小组记录代码>有效。也许你需要在这里使用date\u部分(“小时”),而不是。@vyegorov:date\u部分()
是我在回答中建议的非标准(旧)等价物。二对一,学到了一些东西,解决了一个问题。非常感谢。
SELECT date_trunc('hour', occurred) AS hour, COUNT(*) AS ct
FROM log
WHERE occurred >= '2014-01-01 0:0'
AND occurred < '2014-01-02 0:0' -- do not use between for this
GROUP BY 1
ORDER BY 1;
SELECT hour, COUNT(l.occurred) AS ct
FROM generate_series (0,23) h(hour)
LEFT JOIN log l ON occurred >= '2014-01-01 0:0'
AND occurred < '2014-01-02 0:0' -- do not use between for this
AND EXTRACT(hour FROM occurred)::int = h.hour
GROUP BY hour
ORDER BY hour;