0

我有一个应用程序,用户在其中创建存储在 Oracle 数据库中的订单。我试图找到一个错误,该错误仅在用户在他们创建的最后一个订单的 30 秒内创建订单时发生。

这是订单表的结构:

order_id | user_id | creation_date

我想编写一个查询,它可以给我一个订单列表,其中 creation_date 在同一用户的最后一个订单的 30 秒内。结果有望帮助我找到错误。

我尝试使用 Oracle LAG() 函数,但 WHERE 子句似乎没有。

有什么想法吗?

4

3 回答 3

2
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条件放入外部查询中。

于 2013-03-22T00:38:55.990 回答
0
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
于 2013-03-22T06:31:03.913 回答
0

使用 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
于 2013-03-22T16:01:56.817 回答