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
中减去一个序列来做到这一点。当number
s 是连续的时,差异是恒定的:
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按整数值的连续范围分组的主要内容,如果未能解决你的问题,请参考以下文章
Haskell - 按整数值对带有字符串的列表进行排序的函数
Python使用matplotlib可视化连续(数值)变量的堆叠的直方图自定义堆叠直方图中不同分组条形的色彩(Histogram for Continuous Variable)