首页 > 解决方案 > 在 SQL Server 中查找序列号

问题描述

这是我在 SQL Server 中的表:

number     grade    weight
--------------------------
  1         1         185
  2         1         179
  3         3         191
  4         3         192
  5         3         193
  6         1         194
  7         1         196
  8         1         188
  9         1         187
  10        1         200
  11        2         201
  12        2         202
  13        2         203
  14        2         191
  15        2         187

我希望 SQL Server 中的这个输出没有任何临时表:

Number     grade     weight
----------------------------
 1-2         1        364
 3-5         3        576
 6-10        1        965
 11-15       2        984

有谁知道我该怎么做?

标签: sqlsql-serverwindow-functionsgaps-and-islands

解决方案


这是一个差距和孤岛问题。number我认为最简单的方法是计算 和之间的差异row_number()

select 
    concat(min(number), '-', max(number)) number,
    grade,
    sum(weight) weight
from (
    select 
        t.*,
        row_number() over(partition by grade order by number) rn
    from mytable t
) t
group by grade, number - rn
order by min(number)

DB Fiddle 上的演示

号码 | 等级 | 重量
:----- | ----: | -----:
1-2 | 1 | 364
3-5 | 3 | 576
6-10 | 1 | 965
11-15 | 2 | 984

推荐阅读