计算 table 中字符串的出现次数并在新列中报告
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);
要理解为什么这有效,您必须盯着子查询的结果,直到您 "get" 为什么差异定义了相邻值。
预期结果显示(例如)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 |
如果您不熟悉这些,我建议您熟悉它们,因为它们非常方便:
输入
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);
要理解为什么这有效,您必须盯着子查询的结果,直到您 "get" 为什么差异定义了相邻值。
预期结果显示(例如)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 |
如果您不熟悉这些,我建议您熟悉它们,因为它们非常方便: