2017-11-11 134 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); 

要理解爲什麼這個工程,你必須在結果盯子查詢直到你「得到」差異爲什麼定義相鄰值。