获取每个列的计数值

时间:2020-02-17 23:08:08

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

输入

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

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()属性之前,不会填充其他列。

Demo on DB Fiddle

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