2017-09-23 5 views
1

たとえば、各IDの州の日数を数えたいとします。テーブルCurrent_Stateには3つのカラム(Date、ID、State)があり、計算された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のように戻ってきていない場合、唯一のABC、解決策はこれです:

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/stateパーティションがあります。状態がAのように戻ってBに変わることができるなら、もう一度Aは少し複雑ですが、別のクエリが必要です。

+0

ありがとうAlexYes。州はAからBに戻り、Aに戻りますが、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

あなたのデイズイン状態列はあまり有益ではありません。私はそれを無視しています。

私は、(化合物)ユニークなインデックスが日付、ID、状態にあると仮定しています。次に、希望するクエリは次のとおりです。

select count(*) as num_days, id, state 
from  whatever_you_named_your_table 
group by id, state; 
関連する問題