这个问题有点复杂,但要尽可能简单:
我有一个时间戳列表(数百万,但为了简单起见,它说它要小得多):
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分钟之内,那么之后的那个也将是。
最好的方法是将对您来说很重要的数据放入一行,这样您就可以对其进行设置操作。为此,使用窗口函数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个订单的行。然后只需进行简单的日期比较即可选择所需的行。