2017-09-23 93 views
1

例如,我想計算每個ID的狀態天數。表Current_State有三列(日期,ID,狀態),我想添加計算列Days-in-state。如何計算Redshift中給定ID的具有相同字段值的行數?

Date, ID, State, Days-in-state 
1/1/2017, 123, A, 1 
1/2/2017, 123, A, 2 
1/3/2017, 123, A, 3 
1/4/2017, 123, B, 1 
1/5/2017, 123, B, 2 
1/1/2017, 345, A, 1 
1/2/2017, 345, B, 1 
1/3/2017, 345, B, 2 
1/4/2017, 345, B, 3 
1/5/2017, 345, C, 1

我讀了一篇文章,說窗口函數可以工作,但不是很清楚,也沒有ID要求。謝謝你的幫助。

+1

編輯您的問題,並顯示您想要的結果。 –

回答

0

如果美國不回來像ABA,只有農行,該解決方案是這樣的:

select 
date 
,id 
,state 
,row_number() over (partition by id, state order by date) as days_in_state 
from your_table 
order by id,date 

你可以告訴窗口函數來看看行的一些羣體單獨使用partition,你的情況你有ID /狀態分區。如果狀態可以像A一樣變回,那麼B又變回A,這有點複雜,需要另一個查詢。

+0

謝謝AlexYes。狀態將從A到B並返回到A,但是當它返回時(A從B),我想要開始狀態結束的天數。 –

0

這是你想要的嗎?

select id, 
     sum(case when state = 'A' then days_in_state else 0 end) as state_a, 
     sum(case when state = 'B' then days_in_state else 0 end) as state_b, 
     sum(case when state = 'C' then days_in_state else 0 end) as state_c 
from t 
group by id; 

你的數據表明,你可能想max()而非sum()

+0

不,days_in_state字段是我嘗試創建的計算字段。我的不好之處並沒有在問題中說清楚,而問題已更新得更加精確。 –

0

您的Days-in-state專欄似乎沒有很多信息。我無視它。

我假設你有日期,編號,狀態(化合物)唯一索引。然後所需的查詢是:

select count(*) as num_days, id, state 
from  whatever_you_named_your_table 
group by id, state; 
相關問題