示例表
姓名 入院日期 出院日期
aaaaa 20140101 20140115
aaaaa 20140201 20140220
bbbbb 20140101 20140115
bbbbb 20140115 20140205
bbbbb 20140301 20140320
cccccc 20140101 20140115
cccccc 20140115 20140201
cccccc 20140201 20140220
cccccc 20140220 20140305
希望得到
姓名 入院日期 出院日期
aaaaa 20140101 20140115
aaaaa 20140201 20140220
bbbbb 20140101 20140205
bbbbb 20140301 20140320
cccccc 20140101 20140305
------解决思路----------------------
SELECT 姓名,MIN(入院日期)[入院日期],MAX(出院日期)[出院日期]FROM(
SELECT
T1.姓名
,T1.入院日期
,T1.出院日期
,DATEDIFF(DAY,'19000101',T1.出院日期)
-SUM(DATEDIFF(DAY,T2.入院日期,T2.出院日期))GR
FROM TB T1
JOIN TB T2 ON T1.入院日期>=T2.入院日期
GROUP BY
T1.姓名
,T1.入院日期
,T1.出院日期
)T
GROUP BY 姓名,GR
------解决思路----------------------
with a1 (姓名,入院日期,出院日期) as
(
select 'aaaaa','20140101','20140115' union all
select 'aaaaa','20140201','20140220' union all
select 'bbbbb','20140101','20140115' union all
select 'bbbbb','20140115','20140205' union all
select 'bbbbb','20140301','20140320' union all
select 'cccccc','20140101','20140115' union all
select 'cccccc','20140115','20140201' union all
select 'cccccc','20140201','20140220' union all
select 'cccccc','20140220','20140305'
)
SELECT x.姓名,x.入院日期,MIN(y.出院日期) 出院日期
FROM
(
SELECT a.姓名,a.入院日期
FROM a1 a LEFT OUTER JOIN a1 b
ON a.姓名=b.姓名 and a.入院日期>b.入院日期 AND a.入院日期<=b.出院日期
GROUP BY a.姓名,a.入院日期
HAVING COUNT(b.入院日期)=0
) x
INNER JOIN
(
SELECT a.姓名,a.出院日期
FROM a1 a LEFT OUTER JOIN a1 b
ON a.姓名=b.姓名 and a.出院日期>=b.入院日期 AND a.出院日期<b.出院日期
GROUP BY a.姓名,a.出院日期
HAVING COUNT(b.入院日期)=0
) y
ON x.姓名=y.姓名 and x.入院日期<=y.出院日期
GROUP BY x.姓名,x.入院日期