对不起凌乱的头衔,如果你是主持人并且知道更好的头衔,请随时改变。
说,我们有两个SQL表
intervals vals -------- ------- since val -------- ------- 1 1 4 2 8 3 20 4 ... ... 500 100
我想进行连接,以便来自interval表的“since”字段是“val”的下限。并且“自”没有“val”的值不会出现。看看我想得到什么:
since val -------------- 1 1 1 2 1 3 4 4 4 5 4 6 4 7 8 8 8 9 .....
如何在通用SQL中执行此操作? Postgres-only解决方案也适用。
答案 0 :(得分:3)
不要将其视为“多行”,而应将其视为范围。
这样做你想要的:
select i.since, v.val
from intervals i
join vals v on v.val between i.since and
(select min(since) - 1 from intervals where since > i.since)
order by 1, 2;
测试代码(根据OP的问题在postgres上运行):
create table intervals (since int);
create table vals (val int);
insert into intervals values (1), (4), (8), (20), (500);
insert into vals values (1), (2), (3), (4), (5), (6), (7), (8), (9), (100);
以上查询的输出:
1 1
1 2
1 3
4 4
4 5
4 6
4 7
8 8
8 9
20 100
答案 1 :(得分:2)
归功于#postgresql上的RhodiumToad
SELECT *
FROM vals v
JOIN (select since
, lead(since) over (order by since) as "end"
from intervals) s
ON ( v.val >= s.since
AND ((v.val >= s."end") IS NOT TRUE)
)
;