[英]Count number occurrences of a String in a table and report it in a new column
輸入項
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
請注意-我在名稱欄中有超過100000個唯一條目,因此我無法在代碼中硬編碼名稱
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);
要理解為什么這樣做,您必須盯着子查詢的結果,直到“得到”差異為何定義相鄰值的原因為止。
預期的結果顯示(例如)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 |
如果您不熟悉這些,建議您這樣做,因為它們非常方便:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.