所以我有一张这样的表:
---id---datetime---month---active
1 2016-12-01 Dec-16 0
1 2016-12-02 Dec-16 1
1 2017-01-28 Jan-17 1
1 2017-02-03 Feb-17 0
1 2017-02-24 Feb-17 0
1 2017-03-05 Mar-17 0
1 2017-03-24 Mar-17 1
1 2017-04-02 Apr-17 1
1 2017-04-25 Apr-17 1
1 2017-05-02 May-17 1
1 2017-05-28 May-17 0
我想得到这样的结果:
---id---monthCount---Active
1 1 0
1 2 1
1 2 0
1 3 1
1 1 0
该表确实有多个id
。
现在我只是使用分区获得最小和最大日期之间的差异,并按id
,active
排序并按datetime
排序,但这给了我几个月的时间当它第一次变为1并且最终变为0之间时。我希望每次active
的更改都将它分开。
我怎样才能做到这一点?
答案 0 :(得分:0)
您可以使用行号的差异来识别组(这是间隙和岛屿问题)。最终解决方案需要count(distinct)
:
select id, count(distinct month) as monthcount, active
from (select t.*,
row_number() over (partition by id order by month, active) as seqnum_i,
row_number() over (partition by id, active order by month) as seqnum_ia
from t
) t
group by id, active, (seqnum_i - seqnum_ia);
这假设数据按id,month,active排序 - 这是问题中数据的排序。最好有一个列清楚地定义行的排序顺序。
答案 1 :(得分:0)