Untuk PostgreSQL, saya rasa Anda menginginkan lag
fungsi jendela
untuk membandingkan baris; itu akan jauh lebih efisien daripada self-join dan filter. Ini tidak akan bekerja dengan MySQL, karena tampaknya masih tidak mendukung fungsi jendela standar SQL:2003; lihat di bawah.
Untuk menemukan hanya dua yang terendah, Anda dapat menggunakan dense_rank
fungsi jendela di atas ticketid
, lalu filter hasil untuk mengembalikan hanya baris di mana dense_rank() = 2
, yaitu baris dengan stempel waktu kedua-dari-terendah, di mana lag()
akan menghasilkan baris dengan stempel waktu terendah.
Lihat SQLFiddle ini yang menunjukkan contoh DDL dan keluaran.
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;
Saya telah menggunakan ticketdate
sebagai nama kolom tanggal karena date
adalah nama yang buruk untuk sebuah kolom (ini adalah nama tipe data) dan tidak boleh digunakan; itu harus dikutip ganda dalam banyak situasi untuk bekerja.
Pendekatan portabel mungkin adalah self-join yang telah diposting orang lain. Pendekatan fungsi jendela di atas mungkin bekerja di Oracle juga, tetapi tampaknya tidak di MySQL. Sejauh yang saya tahu itu tidak mendukung fungsi jendela SQL:2003.
Definisi skema akan bekerja dengan MySQL jika Anda SET sql_mode = 'ANSI'
dan gunakan timestamp
bukannya timestamp with time zone
. Tampaknya fungsi jendela tidak; MySQL tersedak pada OVER
ayat. Lihat SQLFiddle ini
.