【发布时间】:2017-10-31 22:33:05
【问题描述】:
我有这个 SQL 查询,它返回下表:
select tk1.ticketid,tk1.ownergroup,tk1.CHANGEDATE as dateentered
from tkstatus as tk1
where TK1.TICKETID='SR4402' and ownergroup is not null
ORDER BY dateentered
TICKETID OWNERGROUP DATEENTERED
SR4402 CONTROLDESK-ESB 2017-05-17 14:01:32
SR4402 IT-ZAŠTITA 2017-05-24 13:11:34
SR4402 IT-PODRŠKA 2017-05-24 13:30:57
SR4402 IT-ZAŠTITA 2017-05-24 13:46:17
SR4402 IT-PODRŠKA 2017-05-24 13:52:52
SR4402 IT-ZAŠTITA 2017-05-24 14:12:32
TKSTATUS 表有整数主列TKSTATUSID,它对每一行都是唯一的,并且每一行都有更大的下一个值。
现在,对于我想要查找该记录何时退出该组的每一行,这意味着这是下一组的时间。
所以基本上对于这张表,我应该再有 6 行,但最后一行应该有该列DATEEXITED NULL,因为它仍在该组中。
所以我写了这个查询:
select tk1.ticketid,tk1.status,tk1.ownergroup,
tk1.CHANGEDATE as dateentered,tk2.changedate as dateexited
from tkstatus as tk1
left outer join tkstatus as tk2 on tk2.ticketid=tk1.ticketid
where
tk2.tkstatusid in (
SELECT MIN(tk3.TKSTATUSID)
FROM TKSTATUS as tk3
WHERE tk3.TICKETID=tk2.ticketid AND tk3.ownergroup is not null
and tk3.ownergroup!=tk1.ownergroup AND tk3.CHANGEDATE>tk1.changedate
)
AND TK1.TICKETID='SR4402'
ORDER BY dateentered
这会返回 5 行而不是 6 行!!!
我希望第 6 行有列 DATEEXITED null
TICKETID OWNERGROUP DATEENTERED DATEEXITED
SR4402 CONTROLDESK-ESB 2017-05-17 14:01:32 2017-05-24 13:11:34
SR4402 IT-ZAŠTITA 2017-05-24 13:11:34 2017-05-24 13:30:57
SR4402 IT-PODRŠKA 2017-05-24 13:30:57 2017-05-24 13:46:17
SR4402 IT-ZAŠTITA 2017-05-24 13:46:17 2017-05-24 13:52:52
SR4402 IT-PODRŠKA 2017-05-24 13:52:52 2017-05-24 14:12:32
我想以某种方式拥有和最后一行这样的
SR4402 IT-ZAŠTITA 2017-05-24 14:12:32 NULL
重要提示:
TKSTATUSID是TKSTATUS表的主要唯一列-
我之前尝试在
ON之后的JOIN中包含TKSTATUSID,但随后返回 SQLSTATE 错误 42972,因为在 JOIN 之后我不能拥有IN和MIN。
所以这不起作用(返回错误)。
left outer join tkstatus as tk2 on
tk2.ticketid=tk1.ticketid
and tk2.tkstatusid in (
SELECT MIN(tk3.TKSTATUSID)
FROM TKSTATUS as tk3
WHERE tk3.TICKETID=tk2.ticketid
AND tk3.ownergroup is not null
and tk3.ownergroup!=tk1.ownergroup
and tk3.CHANGEDATE>tk1.changedate)
【问题讨论】:
-
您需要将
tk2.tkstatusid的条件从 where 移到 JOIN 条件中 -
你能写出你的意思吗?
-
请检查我更新的问题。我已经尝试将 TKSTATUSID 放入 JOIN 中,但是我遇到了问题,因为对于相同的查询,返回 sqlstate 42972
-
@Dejan Lounis 的回答演示了将 LEAD 与分区一起使用。显然它是在 9.7 版中添加到 DB2 中的。因此,如果可能,强烈建议您使用它。除了更容易阅读之外,它的性能应该比我的答案好得多(这是不支持这些功能的数据库的后备)。
-
@Dejan 为什么您无法使用您之前接受的答案以及非常 similar question?
标签: sql select null db2 left-join