2015-04-03 55 views
3

如何编写Postgresql查询以按小时查找用户的计数?如何按时间段(例如小时)选择每个用户的计数?

表:

date     name 
------------------- ---- 
2015-01-01 23:11:11 John 
2015-02-02 23:22:22 John 
2015-02-02 23:00:00 Mary 
2015-02-02 23:59:59 Mary 
2015-03-03 00:33:33 Mary 

所需的输出:

 hour   | name | count 
---------------------+---------+------- 
2015-01-01 23:00:00 | John |  1 
2015-02-02 23:00:00 | Mary |  2 
2015-02-02 23:00:00 | John |  1 
2015-03-03 00:00:00 | Mary |  1 

我想这http://www.sqlfiddle.com/#!12/a50d4/2

CREATE TABLE my_table (
    date TIMESTAMP WITHOUT TIME ZONE, 
    name TEXT 
); 
INSERT INTO my_table (date, name) VALUES ('2015-01-01 23:11:11', 'John'); 
INSERT INTO my_table (date, name) VALUES ('2015-02-02 23:22:22', 'John'); 
INSERT INTO my_table (date, name) VALUES ('2015-02-02 23:00:00', 'Mary'); 
INSERT INTO my_table (date, name) VALUES ('2015-02-02 23:59:59', 'Mary'); 
INSERT INTO my_table (date, name) VALUES ('2015-03-03 00:33:33', 'Mary'); 

SELECT DISTINCT 
     date_trunc('hour', "date") AS hour, 
     name, 
     count(*) OVER (PARTITION BY date_trunc('hour', "date")) AS count 
FROM my_table 
ORDER BY hour, count; 

,但它给了我:

hour    | name | count | 
---------------------|------|-------| 
2015-01-01 23:00:00 | John |  1 | 
2015-02-02 23:00:00 | Mary |  3 | 
2015-02-02 23:00:00 | John |  3 | 
2015-03-03 00:00:00 | Mary |  1 | 

类似:

+1

你只需要一个窗函数的*运行*计数(那么你还需要'ORDER BY'了'OVER'子句中,使其有意义)。对于每小时的普通计数,一个简单的聚合函数可以完成这项工作。 – 2015-04-03 23:35:29

+0

请不要编辑我的答案,因为你做了两次,我回滚了两个。 – 2015-04-25 19:50:26

回答

3

如果你想坚持的窗口功能,你需要添加 “名” 到你的列表像这样:

http://www.sqlfiddle.com/#!12/a50d4/51

SELECT DISTINCT 
    date_trunc('hour', "date") AS "hour", 
    name, 
    count(name) OVER (PARTITION BY name, date_trunc('hour', "date")) AS "cnt" 
FROM my_table 
ORDER BY hour, cnt DESC 
+0

哈哈哈,你编辑了你的答案,除了列名:D – 2015-04-03 20:53:18

+0

我没注意到。自从它被复制以来,我删除了该部分。 – Bob 2015-04-03 20:55:25

0

我认为你正在寻找这个

SELECT DISTINCT 
     date_trunc('hour', "date") AS hour, 
     name, 
     count(*) as tcount 
FROM my_table 
GROUP BY hour,name 
ORDER BY hour, count(*) Desc 

输出:

 hour   | name | count 
---------------------+---------+------- 
2015-01-01 23:00:00 | John |  1 
2015-02-02 23:00:00 | Mary |  2 
2015-02-02 23:00:00 | John |  1 
2015-03-03 00:00:00 | Mary |  1 

SQLFIDDLE

1

这为我工作:http://www.sqlfiddle.com/#!12/a50d4/57

SELECT DISTINCT name, 
       date_trunc('hour', date) as hour, 
       count(*) as count 
FROM my_table 
GROUP BY name, hour 
ORDER BY hour, count DESC;