簡體   English   中英

在包含日期范圍行的表中,從每行生成一行,包含使用小時數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM