PostgreSQL:运行查询行的计数“分钟”
我需要查询每分钟的总计数,直到那一分钟。
到目前为止,我所能达到的最好的并不是诀窍。它每分钟返回计数,而不是每分钟的总计数: SELECT COUNT(id) AS count,EXTRACT(hour from "when") AS hour,EXTRACT(minute from "when") AS minute FROM mytable GROUP BY hour,minute
只有几分钟的活动
最短 不会比这更简单: SELECT DISTINCT date_trunc('minute',"when") AS minute,count(*) OVER (ORDER BY date_trunc('minute',"when")) AS running_ct FROM mytable ORDER BY 1; >使用date_trunc().它给你准确的你所需要的。
这正是你所需要的。 SELECT DISTINCT to_char(date_trunc('minute',"when"),'DD.MM.YYYY HH24:MI') AS minute,"when")) AS running_ct FROM mytable ORDER BY date_trunc('minute',"when"); 最快的 SELECT minute,sum(minute_ct) OVER (ORDER BY minute) AS running_ct FROM ( SELECT date_trunc('minute',count(*) AS minute_ct FROM tbl GROUP BY 1 ) sub ORDER BY 1; 很像上面,但是: >我使用一个子查询来折叠并计算每分钟的行数。 我发现这是每分钟许多行快得多。 包括没有活动的分钟 最短 @GabiMe在评论中询问如何在时间范围内每分钟获得一行,包括那些没有事件发生的位置(基表中没有行): SELECT DISTINCT m.minute,count(c.minute) OVER (ORDER BY m.minute) AS running_ct FROM (SELECT generate_series(date_trunc('minute',min("when")),max(minute),'1 min') AS minute FROM tbl) m LEFT JOIN (SELECT date_trunc('minute',"when") AS minute FROM tbl) c USING (minute) ORDER BY 1; >使用 最快的 与CTE: WITH cte AS ( SELECT date_trunc('minute',count(*) AS minute_ct FROM tbl GROUP BY 1 ) SELECT m.minute,COALESCE(sum(c.minute_ct) OVER (ORDER BY m.minute),0) AS running_ct FROM (SELECT generate_series(date_trunc('minute','1 min') AS minute FROM cte) m LEFT JOIN cte c USING (minute) ORDER BY 1; 很像上面,但是: >再次,在第一步中每分钟折叠和计数行数,省略了后来的DISTINCT的需要。 每分钟有很多行和几行,并且使用索引“when”这个带有子查询的版本应该更快: SELECT m.minute,max("when"),'1 min') AS minute FROM tbl) m LEFT JOIN ( SELECT date_trunc('minute',count(*) AS minute_ct FROM tbl GROUP BY 1 ) c USING (minute) ORDER BY 1; >这是我用Postgres 9.1 – 9.4测试的几个变体中最快的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |