[英]Apply value specified for date range (from, to) to value in table containing single row per date
[英]In a table containing rows of date ranges, from each row, generate one row per day containing hours of utilization
給定一個包含行的表:
+----+-------------------------+------------------------+
| ID | StartDate | EndDate |
+----+-------------------------+------------------------+
| 1 | 2016-02-05 20:00:00.000 | 2016-02-07 5:00:00.000 |
+----+-------------------------+------------------------+
我想生成一個這樣的表:
+----+------------+----------+
| ID | Date | Duration |
+----+------------+----------+
| 1 | 2016-02-05 | 4 |
| 1 | 2016-02-06 | 24 |
| 1 | 2016-02-07 | 5 |
+----+------------+----------+
這是一個面試風格的問題。 我想知道如何解決這個問題。 是否可以使用標准的SQL查詢語法來完成此操作? 或者像pl / pgSQL這樣的過程語言需要像這樣進行查詢嗎?
基本的想法是這樣的:
SELECT date_trunc('day', dayhour) as dd,count(*)
FROM (VALUES (1, '2016-02-05 20:00:00.000'::timestamp, '2016-02-07 5:00:00.000'::timestamp)
) v(ID, StartDate, EndDate), lateral
generate_series(StartDate, EndDate, interval '1 hour') g(dayhour)
GROUP BY dd
ORDER BY dd;
這會增加一個小時,所以這更准確:
SELECT date_trunc('day', dayhour) as dd,count(*)
FROM (VALUES (1, '2016-02-05 20:00:00.000'::timestamp, '2016-02-07 5:00:00.000'::timestamp)
) v(ID, StartDate, EndDate), lateral
generate_series(StartDate, EndDate - interval '1 hour', interval '1 hour') g(dayhour)
GROUP BY dd
ORDER BY dd;
從技術上講,不需要lateral
(在這種情況下,我會用cross join
替換逗號)。 但是,這是橫向連接的一個例子,因此顯式是好的。
我還應該注意,以上是最簡單的方法。 但是, group by
確實會降低查詢速度。 還有其他方法不需要每小時生成一個系列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.