我正在计算一个结果集,其中连续输入系统的项目作为一个单元折叠,然后从结果字符串/结果集中计算实例。
SELECT items
FROM table
WHERE user = 'John Doe'
ORDER BY date_entered_onto_system
即。随着时间的推移,按日期顺序输入系统的项目为PPP3333PP888P222PPPPPP
我想折叠连续输入项目的字符串,即P3P8P2P 然后计算得到的P数,所以这里的答案是= 4
使用T-SQL。非常感谢您的帮助
答案 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
计算这些值。
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