sql - 分组数据以创建范围列
问题描述
我有下表:
Row Column Type
1 1 =
1 2 =
1 3 O
1 4 =
1 5 =
1 6 O
2 1 =
我需要得到类似的东西
Row Start_Column End_Column Type
1 1 2 =
1 3 3 O
1 4 5 =
1 6 6 O
2 1 1 =
我试图对它进行分组,用 ROW_NUMBER、RANK 进行操作,但没有运气
有谁知道如何做到这一点?
解决方案
这是一种差距和孤岛问题。在这种情况下,最简单的方法可能是行号的差异:
select row, type, min(column), max(column)
from (select t.*,
row_number() over (partition by row, type order by column) as seqnum_2,
row_number() over (partition by row order by column) as seqnum
from t
) t
group by row, type, (seqnum - seqnum_2)
order by row, min(column);
如果column
是连续的,没有间隙,您可以进一步简化:
select row, type, min(column), max(column)
from (select t.*,
row_number() over (partition by row, type order by column) as seqnum_2
from t
) t
group by row, type, (column - seqnum_2)
order by row, min(column);
为什么这行得通?好吧,如果你从 中减去一个递增的序列column
,那么结果是恒定的——当类型相同时。
这是一个 db<>fiddle。
推荐阅读
- r - 用`-`分割r中的月/年字符串
- python - Errno 13 权限被拒绝:'/test.txt'
- google-maps-api-3 - 巴黎和另一个法国城市之间的 Google Distance Matrix API 错误距离(随机问题)
- java - 接受多种http方法?
- django - 如何在循环中从 ForeignKey 关系中获取所有值?
- python-3.x - 如何在后台运行python创建一个独立的进程
- swift - 日期函数返回不正确的结果
- php - Symfony 3.4 没有注册任何 cookie?
- android - 如何更新我的电话号码验证功能以仅验证美国电话号码?
- c# - 如何从C#中的另一个组合框中删除从组合框中选择的项目