2016-03-03 41 views
0

我有一個表,看起來像這樣標記連續幾天在SQL

PATIENT_ID DATE_NOTED 
1    01/01/2015 06:39 
1    01/01/2015 17:15 
1    01/02/2015 04:30 
2    01/01/2015 07:34 
2    01/03/2015 18:16 

表中的日期是時代喘息被記錄在病人的記錄。我想誰擁有的喘息記錄至少連續兩天的至少一個實例標誌的病人,所以結果表看起來是這樣的:

PATIENT_ID CONSECUTIVE 
1    Yes 
2    No 

患者1發生喘息記錄在01/01/2015年和01/02/2015,所以他們會被標記爲是。患者2在2015年1月1日和2015年3月1日錄得喘鳴,因此他們將被標記爲「否」。我玩了一下row_number(),但我無法弄清楚如何編碼。我正在使用Netezza。

回答

1

我認爲最好的辦法是lag()lead()和聚集:

select patient_id, 
     max(case when date_trunc('day', date_noted) = date_trunc('day', prev_date_noted) 
       then 1 else 0 
      end) as IsConsecutiveFlag 
from (select patient_id, date_noted, 
      lag(date_noted) over (partition by patient_id order by date_noted) as prev_date_noted 
     from t 
    ) t 
group by patient_id; 

這將產生一個0/1值。如果你願意的話,你實際上可以用'Yes''No'取代這個詞。

+0

這工作,謝謝! – user3642531

0

我不知道Netezza,但在SQL Server上我會做這樣的事情。

SELECT DISTINCT 
PATIENT_ID 
,CASE WHEN OT2.PATIENT_ID IS NULL THEN 'No' ELSE 'Yes' END AS CONSECUTIVE 
FROM OBSERVATIONTABLE OT1 

LEFT OUTER JOIN OBSERVATIONTABLE OT2 
ON OT2.PATIENT_ID = OT1.PATIENT_ID 
AND CONVERT(DATE, OT1.DATE_NOTED) = DATEADD(DAY, -1, CONVERT(DATE, OT2.DATE_NOTED)) 

我加入表格本身,但不是加入在同一天,我想加入前一天。如果聯接成功,則聯接表的patID不會爲空,因此我們編寫一個case語句來表示它。

我想可能有更高效的方法來做到這一點。我可能會有一些語法錯誤,因爲我沒有這樣做,但是我希望你能夠理解我正試圖實現的邏輯。