例如,我想计算每个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要求。谢谢你的帮助。
答案 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;