![](/img/trans.png)
[英]How do I join two tables together if and only if an id is linked to multiple rows in the second table in SQL Server CE?
[英]How do I join together multiple time periods over separate rows in SQL?
我有一個包含唯一ID的SQL表和兩個表示時間段(天)開始和結束的列。 對於每個unique_id,如果它們可以組合形成一個連續的句點,我想將行連接在一起。 例如,我有:
unique_id start end
A 2013-01-01 2013-01-02
A 2013-01-03 2013-01-05
A 2013-01-05 2013-01-07
A 2013-01-07 2013-01-09
A 2013-01-09 2013-01-11
B 2013-01-02 2013-01-03
B 2013-01-05 2013-01-06
我想要:
unique_id start end
A 2013-01-01 2013-01-02
A 2013-01-03 2013-01-11
B 2013-01-02 2013-01-03
B 2013-01-05 2013-01-06
我們可以假設沒有重疊的時期。
我怎樣才能做到這一點?
with TableX as(
select * from (values ('A','2013-01-01'::date,'2013-01-02'::date),
('A','2013-01-03'::date,'2013-01-05'::date),
('A','2013-01-05'::date,'2013-01-07'::date),
('A','2013-01-07'::date,'2013-01-09'::date),
('A','2013-01-09'::date,'2013-01-11'::date),
('B','2013-01-02'::date,'2013-01-03'::date),
('B','2013-01-05'::date,'2013-01-06'::date),
('C','2013-01-03'::date,'2013-01-05'::date),
('C','2013-01-05'::date,'2013-01-07'::date),
('C','2013-01-07'::date,'2013-01-09'::date),
('C','2013-01-10'::date,'2013-01-12'::date),
('C','2013-01-12'::date,'2013-01-15'::date)
) X(unique_id, start, endd)
)
select distinct unique_id,
min(start) over(partition by unique_id,grp) as start,
max(endd) over(partition by unique_id,grp) as endd
from
(
select *, sum(new) over(partition by unique_id order by start) grp
from
(
select A.*,
case when start=lag(endd) over(partition by unique_id order by start)
then 0 else 1 end as new
from TableX A
) B
) C
order by unique_id, start
結果:
unique_id|start |endd
A |2013-01-01|2013-01-02
A |2013-01-03|2013-01-11
B |2013-01-02|2013-01-03
B |2013-01-05|2013-01-06
C |2013-01-03|2013-01-09
C |2013-01-10|2013-01-15
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.