Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对列值的更改日期进行不同搜索_Sql_Postgresql_Datetime_Count - Fatal编程技术网

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;