输入
Z.shape = (1701, 1701)
我需要如下输出。
Create Table #t1 (CaseId Int, NewValue char(2),Attribute char(2),TimeStamp datetime)
insert into #t1 values
(1, 'A', 'X' , '2020-01-01 13:01'),
(1, 'Au', 'WB' , '2020-01-01 13:02'),
(1 , 'C' , 'P' , '2020-01-01 13:03'),
(1 , 'Ma', 'WB' , '2020-01-01 13:04'),
(1 , 'C' , 'D', '2020-01-01 13:05'),
(1, 'D' , 'E', '2020-01-01 13:04'),
(2 , 'M' , 'P' , '2020-05-01 15:20'),
(2 , 'X' , 'WB' , '2020-05-01 15:26'),
(2 , 'Y' , 'WB', '2020-05-01 15:29'),
(2 , 'X' , 'P' , '2020-05-01 15:31')
松鼠帮助减少了一切。查询如下。有人知道如何获得这一数字吗?
CaseId NewValue Attribute TimeStamp NewColumn NewColumn Count
1 A X 01:00.0 NULL NULL 0
1 Au WB 02:00.0 Au-WB Au-WB 2
1 C P 03:00.0 Au-WB Au-WB 2
1 Ma WB 04:00.0 Ma-WB Ma-WB 3
1 C D 05:00.0 Ma-WB Ma-WB 3
1 D E 04:00.0 Ma-WB Ma-WB 3
2 M P 20:00.0 NULL NULL 0
2 X WB 26:00.0 X -WB X -WB 1
2 Y WB 29:00.0 Y -WB Y -WB 2
2 X P 31:00.0 Y -WB Y -WB 2
答案 0 :(得分:0)
这个看起来像是一个空白岛问题,每次遇到rpm -qi nano
Attribute
的记录时,都会出现一个新岛。
如果是这样,这是使用窗口函数解决问题的一种方法:
'WB'
内部查询执行一个窗口select
caseId,
newValue,
attribute,
timeStamp,
case when grp > 0
then first_value(newValue) over(partition by caseId, grp order by timeStamp)
+ '-'
+ first_value(attribute) over(partition by caseId, grp order by timeStamp)
end newValue,
case when grp > 0
then count(*) over(partition by caseId, grp)
else 0
end cnt
from (
select
t.*,
sum(case when attribute = 'WB' then 1 else 0 end)
over(partition by caseId order by timeStamp) grp
from #t1 t
) t
order by caseId, timeStamp
来定义组:每当给定的sum()
满足attribute
'WB'
时,就会开始一个新的组。然后,外部查询使用caseId
恢复组中的第一个值,并执行窗口first_value()
以计算每个组的记录数。这是用条件逻辑包装的,因此在满足第一个count()
属性之前,不会填充其他列。
caseId | newValue | attribute | timeStamp | newValue | cnt -----: | :------- | :-------- | :---------------------- | :------- | --: 1 | A | X | 2020-01-01 13:01:00.000 | null | 0 1 | Au | WB | 2020-01-01 13:02:00.000 | Au-WB | 2 1 | C | P | 2020-01-01 13:03:00.000 | Au-WB | 2 1 | Ma | WB | 2020-01-01 13:04:00.000 | Ma-WB | 3 1 | D | E | 2020-01-01 13:04:00.000 | Ma-WB | 3 1 | C | D | 2020-01-01 13:05:00.000 | Ma-WB | 3 2 | M | P | 2020-05-01 15:20:00.000 | null | 0 2 | X | WB | 2020-05-01 15:26:00.000 | X -WB | 1 2 | Y | WB | 2020-05-01 15:29:00.000 | Y -WB | 2 2 | X | P | 2020-05-01 15:31:00.000 | Y -WB | 2
答案 1 :(得分:0)
使用查询输出,创建一个cte并使用windowing函数按caseid,newcolumn上的分区进行计数,如下所示
with data
as (
select *, wb.NewColumn
from #t1 t
outer apply
(
select top 1 x.NewValue + '-' + x.Attibute as NewColumn
from #t1 x
where x.CaseId = t.CaseId
and x.TimeStamp <= t.TimeStamp
and x.Attibute = 'WB'
order by x.TimeStamp desc
) wb
)
select *,count(*) over(partition by caseid,newcolumn) as cnt
from data