使用布尔条件计算具有条件sql的月份

时间:2017-05-26 21:32:42

标签: sql-server sql-server-2012 gaps-and-islands

所以我有一张这样的表:

---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

现在我只是使用分区获得最小和最大日期之间的差异,并按idactive排序并按datetime排序,但这给了我几个月的时间当它第一次变为1并且最终变为0之间时。我希望每次active的更改都将它分开。

我怎样才能做到这一点?

2 个答案:

答案 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)

在sql server 2012+中,你可以像这样使用require()

LAG

演示链接:http://rextester.com/SJZ16279