SQL按整数值的连续范围分组

Posted

技术标签:

【中文标题】SQL按整数值的连续范围分组【英文标题】:SQL Group by continuous range of integer values 【发布时间】:2019-03-06 12:17:00 【问题描述】:

我有一张这样的桌子:

id  number  owner
47   100      1
48   101      1
49   102      1
50   103      2
51   104      2
52   105      2
53   106      1
54   107      1
55   108      2
56   109      2
57   110      2

如何按数字和所有者的连续范围分组以获得如下结果:

from_number  to_number    owner
   100          102         1
   103          105         2
   106          107         1
   108          110         2

我试过了:SELECT MIN(number), MAX(number), owner FROM table GROUP BY owner,但得到了结果:

MIN(number)  MAX(number)  owner 
   100          107        1
   103          110        2

【问题讨论】:

我正在学习 SQL 并使用 SQlite 作为沙箱 【参考方案1】:

这是一种“群体和岛屿”问题。您可以通过从number 中减去一个序列来做到这一点。当numbers 是连续的时,差异是恒定的:

select owner, min(number) as from_number, max(number) as to_number
from (select t.*,
             row_number() over (partition by owner order by number) as seqnum
      from t
     ) t
group by owner, (number - seqnum);

【讨论】:

谢谢!但是您能解释一下(number - seqnum) 的含义以及它是如何工作的吗? @Googrom 。 . .从数字中减去一个序列。运行子查询,您将看到它如何定义您想要的组。【参考方案2】:

您可以尝试通过生成两个行号并获取它们的差异

select owner, min(number) as min_number, max(number) as max_number
from (select a.*,
             row_number() over (partition by owner order by number) as rn1,
             row_number() over(order by number) rn2
      from table_name a
     ) t
group by owner, (rn2 - rn1);

【讨论】:

以上是关于SQL按整数值的连续范围分组的主要内容,如果未能解决你的问题,请参考以下文章

Numpy:如何按整数值缩放整数数组?

如何按整数值对哈希图进行排序[重复]

如何按整数值降序对该表进行排序?

Haskell - 按整数值对带有字符串的列表进行排序的函数

Python使用matplotlib可视化连续(数值)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩(Histogram for Continuous Variable)

MYSQL计算连续与不连续区间的方法