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萬個的唯一條目因此我不能在代碼中硬編碼名稱
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萬個的唯一條目因此我不能在代碼中硬編碼名稱
預期的結果顯示(例如)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。
| name | Occurance |
|------|-----------|
| A | 1 |
| A | 2 |
| B | 1 |
| B | 2 |
| B | 3 |
| B | 4 |
| C | 1 |
| B | 5 |
| C | 2 |
| A | 3 |
| D | 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);
要理解爲什麼這個工程,你必須在結果盯子查詢直到你「得到」差異爲什麼定義相鄰值。
提示:這是他只需使用合適的軟件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服務器2014'。語法和功能的差異往往會影響答案。請注意,'tsql'縮小了選擇範圍,但不指定數據庫。 – HABO
http://idownvotedbecau.se/noattempt/ – pmcilreavy