【问题标题】:Count number occurrences of a String in a table and report it in a new column计算表中字符串的出现次数并在新列中报告
【发布时间】:2017-11-11 02:37:13
【问题描述】:

输入

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 个唯一条目,因此我无法在代码中硬编码名称

【问题讨论】:

  • 提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql 缩小了选择范围,但没有指定数据库。

标签: sql tsql count rdbms


【解决方案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()

【讨论】:

  • 非常感谢您,简单而完美的回答加上您提供的参考主题真的很方便。
【解决方案2】:

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);

要理解为什么会这样,你必须盯着子查询的结果,直到你“明白”为什么差异定义了相邻的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 2022-01-06
    • 1970-01-01
    • 2014-08-22
    • 2016-01-03
    • 1970-01-01
    • 2019-06-03
    • 2014-04-24
    相关资源
    最近更新 更多