【问题标题】:Counting how many times a boolean value changes in SQL Server计算 SQL Server 中布尔值更改的次数
【发布时间】:2015-01-05 21:55:14
【问题描述】:

我有这张桌子:

     [SDate - DateTime]                 [Value] - Represents a boolean
    2010-11-16 10:10:00                    1
    2010-11-16 10:11:00                    0
    2010-11-16 10:12:00                    1
    2010-11-16 10:13:00                    1

我需要一个查询来计算值更改的次数。

例如:

    2010-11-16 10:10:00                    0
    2010-11-16 10:11:00                    1
    2010-11-16 10:12:00                    0
    2010-11-16 10:13:00                    0
    2010-11-16 10:14:00                    1
    2010-11-16 10:15:00                    0
    2010-11-16 10:16:00                    1
    ...
                                       5 changes

    2010-11-16 10:10:00                    0
    2010-11-16 10:11:00                    0
    2010-11-16 10:12:00                    0
    2010-11-16 10:13:00                    1
    2010-11-16 10:14:00                    1
    2010-11-16 10:15:00                    1
    2010-11-16 10:16:00                    1
    ...                                       
                                        1 change

【问题讨论】:

    标签: sql tsql sql-server-2012


    【解决方案1】:

    您可以使用lag()

    select count(*)
    from (select t.*, lag(value) order by (sdate) as prev_value
          from table t
         ) t
    where prev_value <> value ;
    

    【讨论】:

    • 非常感谢!,我想已经结束了(order by (sdate))
    【解决方案2】:

    这应该也适用于早期版本..

    ;WITH cte
         AS (SELECT Row_number()OVER(ORDER BY sdates) rn,*
             FROM   <tablename>)
    SELECT Sum(CASE WHEN a.boolvalue = b.boolvalue THEN 0 ELSE 1 END)
    FROM   cte a
           JOIN cte b
             ON a.rn = b.rn + 1 
    

    【讨论】:

      【解决方案3】:

      SQL Server 2012 之前的解决方案:

      declare @t table ( sdate datetime, value int )
      
      insert into @t(sdate, value)
      values
      --('2010-11-16 10:10:00', 0),
      --('2010-11-16 10:11:00', 1),
      --('2010-11-16 10:12:00', 0),
      --('2010-11-16 10:13:00', 0),
      --('2010-11-16 10:14:00', 1),
      --('2010-11-16 10:15:00', 0),
      --('2010-11-16 10:16:00', 1)
      ('2010-11-16 10:10:00', 0),
      ('2010-11-16 10:11:00', 0),
      ('2010-11-16 10:12:00', 0),
      ('2010-11-16 10:13:00', 1),
      ('2010-11-16 10:14:00', 1),
      ('2010-11-16 10:15:00', 1),
      ('2010-11-16 10:16:00', 1)
      
      
      ;with t_with_seq as (
        select 
          t.*,
          ROW_NUMBER() OVER(ORDER BY t.sdate asc) as seq
        from @t t
      )
      select 
        COUNT(*) 
      from t_with_seq r
        inner join t_with_seq r_next on r_next.seq = r.seq + 1
      where r.value <> r_next.value
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多