gpt4 book ai didi

sql - Allen 在 SQL 中的区间代数运算

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:45 26 4
gpt4 key购买 nike

我一直在努力解决 SQL 中的一些棘手问题,我需要从事件间隔推断 Assets 利用率,并且刚刚了解了 Allen's Interval Algebra ,这似乎是解决这些问题的关键。

代数描述了 13 种区间之间的关系,下图显示了前七种,其余为倒数(即 y 在 x 之前,y 与 x 等)

enter image description here

但我无法找到如何实现相关操作。

根据我的示例数据,我如何才能从 SQL 或 PLSQL 中的以下三种类型的操作中获取结果?

  1. 脱离
  2. 减少
  3. 寻找差距

请查看我的 SQLFiddle 链接:http://sqlfiddle.com/#!4/cf0cc


原始数据

   start end width
[1] 1 12 12
[2] 8 13 6
[3] 14 19 6
[4] 15 29 15
[5] 19 24 6
[6] 34 35 2
[7] 40 46 7

enter image description here


操作 1 - 脱节结果

我想要一个从上面的数据中返回不相交集的查询,其中所有重叠间隔都被分解成行,因此不存在重叠。

我该如何处理这个 SQL?

     start end width
[1] 1 7 7
[2] 8 12 5
[3] 13 13 1
[4] 14 14 1
[5] 15 18 4
[6] 19 19 1
[7] 20 24 5
[8] 25 29 5
[9] 34 35 2
[10] 40 46 7

enter image description here enter image description here


操作 2 - 减少结果

我该如何减少/拉平间隔,这样它们是:

  • 不为空(即它们具有非空宽度);
  • 不重叠;
  • 从左到右排列;
  • 甚至不相邻(即两个连续范围之间必须有一个非空间隙)

对于我的例子,这看起来像:

    start end width
[1] 1 29 29
[2] 34 35 2
[3] 40 46 7

enter image description here enter image description here


操作3 - 差距结果

另外,我如何找到差距?

   start end width
[1] 30 33 4
[2] 36 39 4

enter image description here enter image description here

最佳答案

这是一个SQLFiddle demo首先创建临时表以简化查询,尽管您可以将这些创建查询放入最终查询中并在没有临时表的情况下执行:

create table t as select * from
(
select null s ,"start"-1 as e from data
union all
select "start" s,null e from data
union all
select "end"+1 s ,null e from data
union all
select null s ,"end" e from data
) d where exists (select "start"
from data where d.s between data."start" and data."end"
or d.e between data."start" and data."end"
);
--Operation 1 - Disjoined Result
create table t1 as select s,e,e-s+1 width from
(
select distinct s,(select min(e) from t where t.e>=t1.s) e from t t1
) t2 where t2.s is not null and t2.e is not null;

--Operation 2 - Reduced Result
create table t2 as
select s,e,e-s+1 width from
(
select s,(select min(d2.e) from t1 d2 where d2.s>=d.s and not exists
(select s from t1 where t1.s=d2.e+1) ) e
from
t1 d where not exists(select s from t1 where t1.e=d.s-1)
) t2;

--Temp table for Operation 3 - Gaps
create table t3 as
select null s, s-1 e from t2
union all
select e+1 s, null e from t2;

现在这里是查询:

--Operation 1 - Disjoined Result
select * from t1 order by s;

--Operation 2 - Reduced Result


select * from t2 order by s;

--Operation 3 - Gaps

select s,e,e-s+1 width
from
(
select s,(select min(e) from t3 where t3.e>=d.s) e from t3 d
) t4 where s is not null and e is not null
order by s;

关于sql - Allen 在 SQL 中的区间代数运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12069082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com