[英]split single row into multiple rows in SQL
在我的表格中,有兩個字段start和stop分別存儲開始時間和停止時間。
例如開始時間= 2014-01-01 23:43:00和停止= 2014-01-03 03:33:00。 此時間戳需要細分。
1=> 2014-01-01 23:43:00 - 2014-01-02 00:00:00, as date 2014-01-01
2=> 2014-01-02 00:00:01 - 2014-01-03 00:00:00, as date 2014-01-02
3=> 2014-01-03 00:00:01 - 2014-01-03 03:33:00, as date 2014-01-03
作為三個不同的行。
這里的問題是停止和開始時間的差異,例如1天到10天。
為了使其更加復雜,在上面的示例中,我根據日期拆分了時間段,這需要根據時間拆分。 假設在時間02:30:00分裂,所以吐痰應該如下。
1=> 2014-01-01 23:43:00 - 2014-01-02 02:30:00, as date 2014-01-01
2=> 2014-01-02 02:30:01 - 2014-01-03 02:30:00, as date 2014-01-02
3=> 2014-01-03 02:30:01 - 2014-01-03 02:30:00, as date 2014-01-03
4=> 2014-01-03 02:30:01 - 2014-01-03 03:33:00, as date 2014-01-04
完成上述拆分后,我需要計算按日期分組的行。
我正在使用PostgreSQL
。
誰能對此有所啟發!
謝謝!
我認為您的“按時間分割”期望的輸出樣本是錯誤的,應該是這樣
1=> 2014-01-01 23:43:00 - 2014-01-02 02:30:00, as date 2014-01-01
2=> 2014-01-02 02:30:01 - 2014-01-03 02:30:00, as date 2014-01-02
3=> 2014-01-03 02:30:01 - 2014-01-03 03:33:00, as date 2014-01-03
如果是這樣,那就這樣做
select day, count(*)
from (
select generate_series(
(start_time - interval '2 hours 30 minutes')::date,
stop_time,
interval '1 day'
)::date as day
from t
) s
group by day
order by day
創建一個抵押表period
,並將所有可能的期間插入表中,例如from now() -10 years to now()+10 years
。
如果是天數,則應為20年中的所有天數。
之后,您可以從period
表中進行選擇,並使用期間提取代碼來聯接表
您可能需要一個包含每個日期的附加表才能將其連接到基本表。
如果您有一個dates
類的表,其中包含以下值:
date_col
2014-01-01 00:00:00
2014-01-02 00:00:00
2014-01-03 00:00:00
...
然后您可以執行類似的查詢
SELECT GREATEST(start_time, date_col), LEAST(end_time,date_col + interval 1 day) FROM base_table
JOIN dates ON date_col BETWEEN start_time AND end_time
SQL未測試,但顯示出想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.