【发布时间】:2012-08-13 22:48:54
【问题描述】:
我有一个基于 CTE 的查询,我在其中检索两个给定时间跨度之间的每小时间隔。我的查询如下:
获取开始和结束日期时间(比如 07-13-2011 00:21:09 和 07-31-2011 21:11:21) 获取每天每小时间隔之间的每小时总查询值(这里是从 00 到 21,总共 21 小时,但这是参数化的,取决于我为输入提供的小时数)。此查询运行良好,但存在问题。它显示每小时的金额,但对于开始时间,它获取每天 00:00:00 和 00:59:59 之间的所有查询,而不是 00:21:09 - 00:59:59 并且同样适用于结束时间,它获取每天 21:00:00 和 22:00:00 之间的所有查询,而不是 21:00:00 和 21:11:21。 - 顺便说一句,其他小时间隔,例如 03:00 - 04:00 等目前正常检索,没有提供分钟和秒,只有 1 小时的固定间隔 - 我该如何解决这个问题?查询如下,谢谢。
WITH cal AS (
SELECT generate_series('2011-02-02 00:00:00'::timestamp , '2012-04-01 05:00:00'::timestamp , '1 hour'::interval) AS stamp
)
, qqq AS (
SELECT date_trunc('hour', calltime) AS stamp
, count(*) AS zcount
FROM mytable
WHERE calltime >= '07-13-2011 00:21:09' AND calltime <='07-31-2011 21:11:21' AND date_part('hour', calltime) >= 0 AND date_part('hour', calltime) <= 21
GROUP BY date_trunc('hour', calltime)
)
SELECT cal.stamp
, COALESCE (qqq.zcount, 0) AS zcount
FROM cal
LEFT JOIN qqq ON cal.stamp = qqq.stamp
WHERE cal.stamp >= '07-13-2011 00:00:00' AND cal.stamp<='07-31-2011 21:11:21' AND date_part('hour', cal.stamp) >= 0 AND date_part('hour', cal.stamp) <= 21
ORDER BY stamp ASC;
编辑:
我的问题是,尽管我在第一天的开始时间为 00:21:09,但那天之后的几天计算第一小时间隔的总查询计数作为 00:00 之间的总查询计数:00-01:00:00 而不是 00:21:09-01:00:00。(顺便说一下,这应该适用于每天的第一个小时间隔,我可以给 04:30:21 作为开始时间并且这一天将从那里开始每小时计算总查询数等。 - 同样适用于结束时间 21:00:00-21:11:21,只有查询结果中的最后一天采用此间隔,之前的其他天通过计算 21:00:00-22:00:00 而不是 21:00:00-21:11:21 之间的所有查询来计算 21 到 22 小时之间的查询计数。
例如,如果在 2011 年 7 月 14 日 00:00:00 和 01:00:00 之间(7 月 13 日之后的第二天,开始日期)有 200 个查询,但在 00:21:09 之间有 159 个查询- 01:00:00,我应该得到 159 个查询而不是 200 个。此外,如果在任意一天的 21:00:00-22:00:00 之间有 300 个查询,其中 123 个在 21:00 之间: 00-21:11:21,我应该得到 123 个查询而不是 300 个。(这适用于每一天,其他小时间隔应该照常计算,例如 01:00-02:00、20:00-21 :00 等。这是参数,每小时间隔和开始结束时间取决于用户输入 -
【问题讨论】:
-
这个问题很难理解,能否检查语法并提供一些例子(期望结果,实际结果)
-
@leonbloy 在末尾添加了一个小描述作为编辑,如果仍然不清楚,请告诉我。
-
@leonbloy 解决了,将其作为答案发布
标签: postgresql common-table-expression