在连接中使“接近”与“相等”相同

时间:2012-01-13 23:16:14

标签: sql db2

我在这种情况下使用DB2,但我认为这有一个通用的SQL答案。我尽可能地简化了数据。我正在计算对所谓“#34;索赔"”的行为。每项索赔都有一个唯一的索赔号。每个操作都以#34; hhmm"的格式加上时间戳。实际上,我不计算行动,我计算行动会议 - 大多数时候,一个人对一个声明执行一个动作,而这是一个动作会话。但有时一个人对一个声明执行多个动作,相隔几秒或几分钟:也就是一个动作会话。但如果有人在上午10点对某项索赔采取了行动,然后在下午1点对同一索赔采取了行动,那么这将是两次行动会议。就我的目的而言,一个动作会话与两个动作会话之间的时间窗口是3小时,但这当然是任意的。并且不用担心窗户跨越午夜。此外,我对此数据具有只读权限,我必须在一个语句中执行此操作。感谢。

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

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

但我想通过一次加入来做到这一点,所以没有"除了"必要。这是希望性能更好:当然,我的实际数据有更多列被除外和更多行使用。而且除了声明之外似乎正在减慢查询的速度。我通过"使用"使用了大量的临时表。声明,它们似乎比它们各部分的总和慢得多。

2 个答案:

答案 0 :(得分:3)

假设acttime是一个整数列:

select *
from (
   select claim_no,
          acttime, 
          acttime - lag(acttime, 1, acttime) over (partition by claim_no order by acttime) as diff
   from actions
) t
where diff = 0 or diff > 300
order by claim_no

答案 1 :(得分:0)

忘记这件事我觉得有点傻了......

您不需要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路自我一样的东西-join minimum 来检测正确的条目,它也有点复杂;你可能有更好的运气处理这个应用程序方面)