簡體   English   中英

在SQL中將單行拆分為多行

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

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