2017-09-23 90 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; 
相关问题