如何计算Redshift中给定ID的具有相同字段值的行数?

时间:2017-09-23 01:23:26

标签: sql amazon-redshift

例如,我想计算每个ID的状态天数。表Current_State有三列(Date,ID,State),我想添加计算列Days-in-state。

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要求。谢谢你的帮助。

3 个答案:

答案 0 :(得分: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()

答案 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它有点复杂,需要另一个查询。

答案 2 :(得分:0)

您的州内天数列似乎没有太多信息。我忽略了它。

我假设你在日期,id,状态上有一个(复合)唯一索引。然后所需的查询是:

select    count(*) as num_days, id, state
from      whatever_you_named_your_table
group by  id, state;