2017-11-11 133 views
0

输入计数的出现次数,并在新列举报

Name 
A 
A 
B 
B 
B 
B 
C 
B 
C 
A 
D 

所需的输出

Name Occurance 
A 1 
A 2 
B 1 
B 2 
B 3 
B 4 
C 1 
B 5 
C 2 
A 3 
D 1 

请注意 - 我在名称列超过10万个的唯一条目因此我不能在代码中硬编码名称

+1

提示:这是他只需使用合适的软件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服务器2014'。语法和功能的差异往往会影响答案。请注意,'tsql'缩小了选择范围,但不指定数据库。 – HABO

+0

http://idownvotedbecau.se/noattempt/ – pmcilreavy

回答

1

预期的结果显示(例如)A出现3次,并且编号为1,2,3,即使它们并不全部一起出现。单个ROW_NUMBER()就足够了:SQL Fiddle

CREATE TABLE Table1 (ID int identity(1,1) primary key, [Name] varchar(1)); 
INSERT INTO Table1 ([Name]) 
VALUES  ('A'),('A'),('B'),('B'),('B'),('B'),('C'),('B'),('C'),('A'),('D'); 

查询1

select 
     name 
    , row_number() over (partition by name order by id) as Occurance 
from table1 
order by id 

如表被认为是无序的套,以再现该预期的结果中示出的序列有将必须是一些其他专栏。我为此假定了一个身份专栏ID。

Results

| name | Occurance | 
|------|-----------| 
| A |   1 | 
| A |   2 | 
| B |   1 | 
| B |   2 | 
| B |   3 | 
| B |   4 | 
| C |   1 | 
| B |   5 | 
| C |   2 | 
| A |   3 | 
| D |   1 | 

如果你不熟悉这些,我建议你变得如此,因为它们是非常方便的:

  1. ROW_NUMBER()
  2. SELECT - OVER()
+0

非常感谢您,简单而完美的答案以及您提供的参考主题都非常方便。 –

1

SQL表代表无序集。订单仅由指定订单的列提供。

假设你有一个排序 - 如身份id列 - 你可以使用的行数做法上的不同:

select name, count(*) 
from (select name, 
      row_number() over (order by id) as seqnum, 
      row_number() over (partition by name order by id) as seqnum_n 
     from t 
    ) t 
group by name, (seqnum - seqnum_n); 

要理解为什么这个工程,你必须在结果盯子查询直到你“得到”差异为什么定义相邻值。