2017-02-10 7 views
2

これらは、患者が病院を訪問した日付です:T-SQL:前回の日付と日付のリスト

NAME DISCHARGEDATE 
--------------------- 
Eva   1/1/17 
Eva   1/10/17 
Eva   2/8/17 

私は日付患者のリストは、彼らが訪れた前回の日付と一緒に病院を訪れた必要

NAME DISCHARGEDATE  PREVIOUSDISCHARGEDATE 
----------------------------------------------- 
Eva   1/1/17  NULL 
Eva   1/10/17  1/1/17 
Eva   2/8/17  1/10/17 

私はROWNUM()とトップ1と相関サブクエリをしようとしてきたと私はちょうどそれを得ることができない。このような病院、。ありがとうございました。

ここでは、患者の訪問を返し、私は現実のために書いたスクリプトが、2番目のテーブルからすべてのフィールドの「NULL」です:

SELECT 
    ad.Name, 
    ad.DischargeDate, 
    PrevDisch.DischargeDate as PrevDischDate 
FROM 
    AbstractData AS ad 
LEFT JOIN 
    (SELECT TOP 1 
     DischargeDate, UnitNumber, VisitID 
    FROM 
     AbstractData AS ad2 
    WHERE 
     SourceID = 'BLD' 
     AND PtStatus in ('IN', 'INO') 
     AND DischargeDateTime > @ReadmitStartDate 
     --AND ad2.DischargeDate < ad.DischargeDate 
    ORDER BY 
     UnitNumber, DischargeDate) AS PrevDisch ON ad.UnitNumber = PrevDisch.UnitNumber 
               AND PrevDisch.DischargeDate < ad.DischargeDate            
               AND PrevDisch.DischargeDate IS NOT NULL 
WHERE 
    ad.Name = 'Eva' 
+1

あなたが持っている続編のバージョンはありますか? – Kostya

+0

1/20/17がタイプミスであると仮定すると、 –

+0

はい、ありがとう、私はそれを編集しました。 –

答えて

3

あなたは(LAGを使用することができます)

Declare @YourTable table (NAME varchar(25),DISCHARGEDATE date) 
Insert Into @YourTable values 
('Eva','2017-01-01'), 
('Eva','2017-10-01'), 
('Eva','2017-02-08') 

Select A.* 
     ,PREVIOUSDISCHARGEDATE = Lag(DISCHARGEDATE,1) over (Partition By Name Order by DISCHARGEDATE) 
From @YourTable A 

返品

NAME DISCHARGEDATE PREVIOUSDISCHARGEDATE 
Eva  2017-01-01  NULL 
Eva  2017-02-08  2017-01-01 
Eva  2017-10-01  2017-02-08 

編集 - オルタナティブ(LAGに)

;with cte as (
    Select * 
      ,RN = Row_Number() over (Partition By Name Order by DISCHARGEDATE) 
    From @YourTable 
) 
Select A.* 
     ,PREVIOUSDISCHARGEDATE = B.DISCHARGEDATE 
From cte A 
Left Join cte B a.name=B.name and on A.RN=B.RN+1 
+0

Damn。私はちょうどこれを+1しなければならない。あなたは私にそれを打つ! – MarlonRibunal

+0

@ジョン - あなたの答えは素晴らしいです。遅れを起こすことなくソリューションを提供してください。 – balaji

+0

@balaji更新された回答を参照 –

0

私はジョン・カペレッティが既にLAG()を使用して答えを提供していることを知っています。しかし、それで解決策を試してみたかったのです。誰かがLAGなしでそれを必要とするなら、将来的になるかもしれない()。この解決策はちょっと面倒なようですが、その目的を支えています。

Declare @YourTable table (NAME varchar(25),DISCHARGEDATE date) 
Insert Into @YourTable values 
('Eva','2017-01-01'), 
('Eva','2017-10-01'), 
('Eva','2017-02-08') 

SELECT NAME,DISCHARGEDATE,MAX(PREVIOUS) AS PREVIOUS_DISCHARGE 
FROM 
(SELECT NAME,DISCHARGEDATE,'NULL' AS PREVIOUS 
FROM 
(SELECT NAME 
     ,DISCHARGEDATE 
     ,ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DISCHARGEDATE) RN FROM @YourTable) M 
WHERE M.RN=1   
UNION ALL 
SELECT X.NAME,X.DISCHARGEDATE,CONVERT(VARCHAR(10),Y.DISCHARGEDATE) 
FROM 
     (SELECT NAME 
       ,DISCHARGEDATE 
       ,ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DISCHARGEDATE) RN FROM @YourTable) X 
INNER JOIN  
     (SELECT NAME 
       ,DISCHARGEDATE 
       ,(ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY DISCHARGEDATE)-1) RN FROM @YourTable) Y  
ON X.RN > Y.RN) OUTERR 
WHERE CONVERT(VARCHAR(10),DISCHARGEDATE) <> PREVIOUS 
GROUP BY NAME,DISCHARGEDATE 
ORDER BY NAME 
関連する問題