计数连续结果崩溃

时间:2016-11-07 17:12:56

标签: tsql

我正在计算一个结果集,其中连续输入系统的项目作为一个单元折叠,然后从结果字符串/结果集中计算实例。

SELECT  items
FROM    table
WHERE   user = 'John Doe'
ORDER BY    date_entered_onto_system

即。随着时间的推移,按日期顺序输入系统的项目为PPP3333PP888P222PPPPPP

我想折叠连续输入项目的字符串,即P3P8P2P 然后计算得到的P数,所以这里的答案是= 4

使用T-SQL。非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我将假设你在SQL Server 2012或更晚。

示例数据:

以下代码是我用来设置问题中提供的示例情况的代码。

create table #tmp_table (items char(1), date_entered_onto_system datetime)

insert into #tmp_table values ('P', '2016-11-08 12:01:00')
insert into #tmp_table values ('P', '2016-11-08 12:02:00')
insert into #tmp_table values ('P', '2016-11-08 12:03:00')
insert into #tmp_table values ('3', '2016-11-08 12:04:00')
insert into #tmp_table values ('3', '2016-11-08 12:05:00')
insert into #tmp_table values ('3', '2016-11-08 12:06:00')
insert into #tmp_table values ('3', '2016-11-08 12:07:00')
insert into #tmp_table values ('P', '2016-11-08 12:08:00')
insert into #tmp_table values ('P', '2016-11-08 12:09:00')
insert into #tmp_table values ('8', '2016-11-08 12:10:00')
insert into #tmp_table values ('8', '2016-11-08 12:11:00')
insert into #tmp_table values ('8', '2016-11-08 12:12:00')
insert into #tmp_table values ('P', '2016-11-08 12:13:00')
insert into #tmp_table values ('2', '2016-11-08 12:14:00')
insert into #tmp_table values ('P', '2016-11-08 12:15:00')
insert into #tmp_table values ('P', '2016-11-08 12:16:00')
insert into #tmp_table values ('P', '2016-11-08 12:17:00')
insert into #tmp_table values ('P', '2016-11-08 12:18:00')
insert into #tmp_table values ('P', '2016-11-08 12:19:00')
insert into #tmp_table values ('P', '2016-11-08 12:20:00')

<强>答案:

此查询使用lag()及以后的over函数和SQL Server 2012子句(下面的链接)。此查询比较行之间的items值和它之前的行(根据date_entered_onto_system值按时间顺序排列)。如果它应该计数,则计算为1,否则计算为0,然后sum计算这些值。

Lag Function

Over Clause

select b.items
, sum(b.sum_val) as items_cnt
from (
    select a.items
    , case when a.items = lag(a.items, 1, NULL) over (order by a.date_entered_onto_system asc) then 0 else 1 end as sum_val
    from #tmp_table as a
    ) as b
group by b.items

<强>结果:

这是示例数据的输出。

items  items_cnt
  2        1
  3        1
  8        1
  P        4