对于Postgresql,我认为您想让lag
window函数比较行。它比自连接和过滤器要有效得多。这不适用于MysqL,因为它似乎仍然不支持标准的sql:2003窗口函数。见下文。
要只找到最低的两个,可以在上使用dense_rank
window函数ticketid
,然后过滤结果以仅返回where的行dense_rank() = 2
,即时间戳从最低的倒数第二lag()
的行,在那里将产生时间戳最小的行。
请参阅此SQLFiddle ,其中显示了示例DDL和输出。
SELECT ticketid, extract(epoch from tdiff) FROM (
SELECT
ticketid,
ticketdate - lag(ticketdate) OVER (PARTITION BY ticketid ORDER BY ticketdate) AS tdiff,
dense_rank() OVER (PARTITION BY ticketid ORDER BY ticketdate) AS rank
FROM Table1
ORDER BY ticketid) x
WHERE rank = 2;
我将其ticketdate
用作date列的名称,因为它date
是列的可怕名称(它是数据类型名称),并且永远不应该使用;在许多情况下,必须使用双引号将其引用。
便携式方法可能是其他人发布的自加入方法。上面的窗口函数方法可能也适用于Oracle,但似乎不适用于MysqL。据我所知,它不支持sql:2003窗口函数。
如果您SET sql_mode = 'ANSI'
使用模式定义,它将与MysqL一起使用timestamp
,并使用代替timestamp with time zone
。似乎窗口功能不会;MysqL对该OVER
子句感到窒息。请参阅此SQLFiddle。