用group by计算sql

man*_*des 1 sql sql-server gaps-and-islands

我的表temp包含4列

create table Temp
(
seqno int identity (1,1),
name varchar(20),
towncd numeric,
Counttown_cd,

)
Run Code Online (Sandbox Code Playgroud)

我想写一个查询,它返回城镇的数量,但如果name和towncd相同,那么在前一个记录中添加的数量为shroud

1 man   0001 
2 man   0001 
3 test  0003 
4 man   0001  
5 man   0001 
Run Code Online (Sandbox Code Playgroud)

它应该回归

    1 man  0001 2
    2 man  0001 null
    3 test 0003 1
    4 man  0001 2
    5 man  0001 null
Run Code Online (Sandbox Code Playgroud)

我试过以下查询:

    SELECT p.seqno ,p.name,P.towncd ,COUNT(P.towncd )Counttown_cd
                FROM temp P
                GROUP BY P.name,P.towncd ,p.seqno 
                order by p.seqno 
Run Code Online (Sandbox Code Playgroud)

Sql*_*Zim 6

您对问题的编辑为原始问题添加了空白和岛屿问题.这可以通过row_number()子查询中的两个s 来解决,如下所示:

select seqno, name, towncd
  , Counttown_cd = case 
      when row_number() over (partition by name,towncd,grp order by seqno) = 1 
        then count(*) over (partition by name,towncd, grp) 
      else null 
      end
from (
  select *
    , grp = row_number() over (partition by name,towncd order by seqno) 
          - row_number() over (order by seqno)
  from temp
    ) t
order by seqno
Run Code Online (Sandbox Code Playgroud)

rextester演示:http://rextester.com/VGXI71945

收益:

+-------+------+--------+--------------+
| seqno | name | towncd | Counttown_cd |
+-------+------+--------+--------------+
|     1 | man  |   0001 | 2            |
|     2 | man  |   0001 | NULL         |
|     3 | test |   0003 | 1            |
|     4 | man  |   0001 | 2            |
|     5 | man  |   0001 | NULL         |
+-------+------+--------+--------------+
Run Code Online (Sandbox Code Playgroud)


回答原始问题:

使用case表达式和两个窗口函数(row_number()count(*) over())仅显示第一个实例的计数name,towncd:

select seqno, name, towncd
  , Counttown_cd = case 
      when row_number() over (partition by name,towncd order by seqno) = 1 
        then count(*) over (partition by name,towncd) 
      else null 
      end
from temp
Run Code Online (Sandbox Code Playgroud)

rextester演示:http://rextester.com/NZSPR13395

收益:

+-------+------+--------+--------------+
| seqno | name | towncd | Counttown_cd |
+-------+------+--------+--------------+
|     1 | man  |   0001 | 2            |
|     2 | man  |   0001 | NULL         |
|     3 | test |   0003 | 1            |
+-------+------+--------+--------------+
Run Code Online (Sandbox Code Playgroud)