我有一个应用程序,用户在其中创建存储在 Oracle 数据库中的订单。我试图找到一个错误,该错误仅在用户在他们创建的最后一个订单的 30 秒内创建订单时发生。
这是订单表的结构:
order_id | user_id | creation_date
我想编写一个查询,它可以给我一个订单列表,其中 creation_date 在同一用户的最后一个订单的 30 秒内。结果有望帮助我找到错误。
我尝试使用 Oracle LAG() 函数,但 WHERE 子句似乎没有。
有什么想法吗?
SELECT O.*
FROM YourTable O
WHERE EXISTS (
SELECT *
FROM YourTable O2
WHERE
O.creation_date > O2.creation_date
AND O.user_id = O2.user_id
AND O.creation_date - (30 / 86400) <= O2.creation_date
);
在 Sql Fiddle 中查看此操作。
如果需要,您可以使用该LAG
函数,您只需将查询包装到派生表中,然后将您的WHERE
条件放入外部查询中。
SELECT distinct
t1.order_id, t1.user_id, t1.creation_date
FROM
YourTable t1
join YourTable t2
on t2.user_id = t1.user_id
and t2.creation_date between t1.creation_date - 30/86400 and t1.creation_date
and t2.rowid <> t1.rowid
order by 3 desc
使用 LAG() 的示例:
SELECT id, (pss - css) time_diff_in_seconds
, creation_date, prev_date
FROM
(
SELECT id, creation_date, prev_date
, EXTRACT(SECOND From creation_date) css
, EXTRACT(SECOND From prev_date) pss
FROM
(
SELECT id, creation_date
, LAG(creation_date, 1, creation_date) OVER (ORDER BY creation_date) prev_date
FROM
( -- Table/data --
SELECT 1 id, timestamp '2013-03-20 13:56:58' creation_date FROM dual
UNION ALL
SELECT 2, timestamp '2013-03-20 13:57:27' FROM dual
UNION ALL
SELECT 3, timestamp '2013-03-20 13:59:16' FROM dual
)))
--WHERE (pss - css) <= 30
/
ID TIME_DIFF_IN_SECONDS
--------------------------
1 0 <<-- if uncomment where
2 31
3 11 <<-- if uncomment where