Đối với PostgreSQL, tôi nghĩ bạn muốn mã lag > chức năng cửa sổ
để so sánh các hàng; nó sẽ hiệu quả hơn nhiều so với tự tham gia và bộ lọc. Điều này sẽ không hoạt động với MySQL, vì nó dường như vẫn không hỗ trợ các chức năng cửa sổ SQL:2003 tiêu chuẩn; xem bên dưới.
Để chỉ tìm hai giá trị thấp nhất, bạn có thể sử dụng secure_rank
chức năng cửa sổ trên ticketid
, sau đó lọc kết quả để chỉ trả về các hàng có secure_rank () =2
, tức là hàng có dấu thời gian thứ hai từ thấp nhất, trong đó lag ()
sẽ tạo ra hàng có dấu thời gian thấp nhất.
Xem SQLFiddle này hiển thị DDL mẫu và kết quả đầu ra.
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;
Tôi đã sử dụng ticketdate
làm tên cho cột ngày vì date
là một tên khủng khiếp cho một cột (đó là một tên kiểu dữ liệu) và không bao giờ được sử dụng; nó phải được trích dẫn kép trong nhiều tình huống để hoạt động.
Cách tiếp cận di động có lẽ là tự tham gia mà những người khác đã đăng. Cách tiếp cận hàm cửa sổ ở trên có thể cũng hoạt động trên Oracle, nhưng dường như không hoạt động trong MySQL. Theo như tôi có thể phát hiện ra thì nó không hỗ trợ các chức năng cửa sổ SQL:2003.
Định nghĩa lược đồ sẽ hoạt động với MySQL nếu bạn SET sql_mode ='ANSI'
và sử dụng dấu thời gian
thay vì dấu thời gian bằng múi giờ
. Có vẻ như các chức năng cửa sổ sẽ không; MySQL bị nghẹt trên HẾT
mệnh đề. Xem SQLFiddle này
.