gpt4 book ai didi

sql - 在连接中使 "close to"与 "equal"相同

转载 作者:行者123 更新时间:2023-12-04 06:01:35 24 4
gpt4 key购买 nike

在这种情况下我使用 DB2,但我认为这有一个通用的 SQL 答案。我已经尽可能地简化了数据。我正在计算对称为“ claim ”的事情的行动。每个 claim 都有一个唯一的 claim 编号。每个 Action 都以“hhmm”格式标记时间戳。实际上,我不是在计算行动,而是在计算行动 session ——大多数时候,一个人对一项 claim 执行一项行动,这就是一次行动 session 。但有时一个人对一项 claim 执行多项操作,相隔几秒钟或几分钟:这也将是一个操作 session 。但是,如果有人在上午 10 点对 claim 采取行动,然后在下午 1 点对同一 claim 采取行动,那将是两个行动 session 。就我而言,一个 Action session 与两个 Action session 的时间窗口是 3 小时,但这当然是任意的。而且不用担心跨越午夜的窗口。此外,我对该数据具有只读访问权限,并且必须在一个语句中执行此操作。谢谢。

所以这里有一些数据(表:ACTIONS):

CLAIM_NO ACTTIME
AA 1424
BB 1134
CC 1221
DD 1425
DD 1512
EE 1619
FF 0928
FF 1518
GG 1348
HH 1332
II 1350

我想把它变成
CLAIM_NO ACTTIME
AA 1424
BB 1134
CC 1221
DD 1425
EE 1619
FF 0928
FF 1518
GG 1348
HH 1332
II 1350

(注意第二个 DD 记录消失了,但第二个 FF 记录还在)。

我通过将表与自身连接来实现这一点,在 CLAIM_NO 相等且 ACTTIME 介于 3 小时前和 1 分钟前之间。这允许我获取不属于的行,然后我使用 EXCEPT 来消除它们。
with excepto as (
select a.claim_no, b.acttime
from actions a
join actions b
on a.claim_no=b.claim_no
and a.acttime between (b.acttime-300) and (b.acttime-1)
)
select * from actions except select * from excepto

但我想通过一次加入来做到这一点,所以没有必要的“除外”。这是希望性能会更好:当然,我的真实数据有更多的列被除了和更多的行使用。并且那个 except 语句似乎大大减慢了查询速度。我通过“with”语句使用了大量临时表,它们似乎比它们各部分的总和慢得多。

最佳答案

忘记这件事我觉得有点傻……

您不需要 except - 有一个名为 exception 的连接可用这正是你想要的(我已经大量使用它):

SELECT a.claim_no, a.acttime
FROM actions as a
EXCEPTION JOIN actions as b
ON b.claim_no = a.claim_no
AND b.acttime >= a.acttime - 300
AND b.acttime < a.acttime

为您提供以下结果集:
claim_No     acttime
============================
AA 1,424
BB 1,134
CC 1,221
DD 1,425
EE 1,619
FF 928
FF 1,518
GG 1,348
HH 1,332
II 1,350

(不幸的是,对于有人至少每 3 小时进行一次更改的情况,这不会削减它 - 它只会出现第一个。我相信您需要像 6 路自加入最低限度来检测正确的条目,它也有点令人费解;你可能会在处理这个应用程序方面有更好的运气)

关于sql - 在连接中使 "close to"与 "equal"相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8858548/

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