За PostgreSQL мисля, че искате lag
функция прозорец
за сравняване на редовете; ще бъде много по-ефективно от самостоятелно присъединяване и филтър. Това няма да работи с MySQL, тъй като изглежда все още не поддържа стандартните SQL:2003 функции на прозореца; вижте по-долу.
За да намерите само двата най-ниски, можете да използвате dense_rank
функция прозорец над ticketid
, след което филтрирайте резултатите, за да върнете само редове, където 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
е ужасно име за колона (това е име на тип данни) и никога не трябва да се използва; в много ситуации трябва да има двойни кавички, за да работи.
Преносимият подход вероятно е самоприсъединяването, публикувано от други. Подходът на функцията на прозореца по-горе вероятно работи и на Oracle, но изглежда не в MySQL. Доколкото мога да разбера, той не поддържа функциите на прозореца SQL:2003.
Дефиницията на схемата ще работи с MySQL, ако SET sql_mode = 'ANSI'
и използвайте timestamp
вместо timestamp with time zone
. Изглежда функциите на прозореца няма да бъдат; MySQL се задушава от OVER
клауза. Вижте този SQLFiddle
.