可以计算相对于彼此的迭代计数时间戳吗?

时间:2014-10-15 15:48:23

标签: sql postgresql

这个问题有点复杂,但要尽可能简单:

我有一个时间戳列表(数百万,但为了简单起见,它说它要小得多):

order_times
-----------
2014-10-11 15:00:00
2014-10-11 15:02:00
2014-10-11 15:03:31
2014-10-11 15:07:00
2014-10-11 16:00:00
2014-10-11 16:04:00

我正在尝试构建一个查询(在PostgeSQL中),这将允许我确定order_time在它之前的2 order_times的10分钟内发生的次数(并且不再)。

在上面的示例数据中:

  • 第一个时间戳被认为是0,因为之前没有订单
  • 第二个时间戳被认为是0,因为它在10分钟之内 之前但是之前只有1个请求
  • 第三个时间戳被认为是1,因为在10分钟内至少有2个订单
  • (依此类推)......

我希望这很清楚!

1 个答案:

答案 0 :(得分:0)

您不需要查看前面的第一个,只需要查看每个之前的那个。如果那是在10分钟之内,那么之后的那个也将是。

最好的方法是将对您来说很重要的数据放入一行,这样您就可以对其进行设置操作。为此,使用窗口函数ROW_NUMBER()和自连接。这是MS SQL做你想做的事的方式。

WITH T1 AS (
SELECT ID, Order_Time, ROW_NUMBER() OVER( ORDER BY Order_Time) AS RowNumber FROM myTest)

    SELECT T1.ID,T1.Order_Time, T2.ID AS CompareID,T2.Order_Time AS CompareTime
    FROM T1 LEFT OUTER JOIN T1 AS T2 ON T1.RowNumber-2 = T2.RowNumber 
    WHERE DATEDIFF(n,t2.Order_Time,t1.Order_Time)<=10

首先,我们创建一个具有行号的查询,然后将其用作内联表来进行自联接以构建包含每个订单的行,以及在它之前发生2个订单的行。然后只需进行简单的日期比较即可选择所需的行。