我无法解决以下问题:
我有两个包含范围和值的数据集,例如
数据集1
| 从|到|价值|
| --------------|--------------|--------------|
| 0|二十|A|
| 二十|五十|B|
| 五十|一百五十|C|
| 一百五十|一百八十|X|
数据集2
| 从|到|价值|
| --------------|--------------|--------------|
| 10个|三十|D|
| 七十|一百|E|
我想使用SQL将这些范围相交,但也包括Dataset 1中的所有范围。
所以结果应该是:
| 从|到|价值|
| --------------|--------------|--------------|
| 0|10个|A|
| 10个|二十|AD|
| 二十|三十|BD|
| 三十|五十|B|
| 五十|七十|C|
| 七十|一百|CE|
| 一百|一百五十|C|
| 一百五十|一百八十|X|
使用SQL很容易只找到相交的部分(10-20,20-30,70-100)和完全不相交的部分(150-180)-我正在努力与部分相交的部分(0-10,30-50,50-70,100-150)。
我把这个用于交叉部分:
SELECT MAX(t1.range_start, t2.range_start) AS intersect_start,
MIN(t1.range_end, t2.range_end) AS intersect_end
FROM ranges t1
JOIN ranges t2 ON t1.range_start < t2.range_end AND t1.range_end > t2.range_start
有人能告诉我解决方案吗?在普通SQL中会很好,但也可以在PL/SQL中
3条答案
按热度按时间wooyq4lh1#
您可以将数据集解透视并合并它们,然后使用
LEAD
分析函数来查找范围中的下一个边界,然后使用递归查询来迭代边界并聚合,添加或删除值,分别在其范围的开始或结束时:其中,对于样本数据:
输出:
| 价值|从|TO|
| --------------|--------------|--------------|
| A|0|10个|
| AD|10个|二十|
| DB|二十|三十|
| B|三十|五十|
| C|五十|七十|
| CE|七十|一百|
| C|一百|一百五十|
| X|一百五十|一百八十|
fiddle
crcmnpdw2#
dbfiddle
说明:
un
-两个表的并集up
-未透视un
,所有不同范围的一列ld
-以上,具有下一个范围值最后,
ld
与un
和ld
连接,listagg()对值进行分组62lalag43#
你可以试试这个查询
参见演示here