簡體   English   中英

計算表中字符串的出現次數並在新列中報告

[英]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 |

如果您不熟悉這些,建議您這樣做,因為它們非常方便:

  1. ROW_NUMBER()
  2. 選擇-OVER()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM