PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Rekor terdekat untuk serangkaian kencan

Harus paling sederhana &tercepat dengan LEFT JOIN dan DISTINCT ON :

WITH x(search_ts) AS (
    VALUES
     ('2012-07-26 20:31:29'::timestamp)              -- search timestamps
    ,('2012-05-14 19:38:21')
    ,('2012-05-13 22:24:10')
    )
SELECT DISTINCT ON (x.search_ts)
       x.search_ts, r.id, r.resulttime
FROM   x
LEFT   JOIN results r ON r.resulttime <= x.search_ts -- smaller or same
-- WHERE some_id = 15                                -- some condition?
ORDER  BY x.search_ts, r.resulttime DESC;

Hasil (nilai dummy):

search_ts           | id     | resulttime
--------------------+--------+----------------
2012-05-13 22:24:10 | 404643 | 2012-05-13 22:24:10
2012-05-14 19:38:21 | 404643 | 2012-05-13 22:24:10
2012-07-26 20:31:29 | 219822 | 2012-07-25 19:47:44

Saya menggunakan CTE untuk memberikan nilai, bisa berupa tabel atau fungsi atau larik tidak bersarang atau kumpulan yang dihasilkan dengan generate_series() sesuatu yang lain juga. (Apakah maksud Anda generate_series() oleh "generate_sequence()"?)

Pertama saya JOIN stempel waktu pencarian untuk semua baris dalam tabel dengan resulttime yang lebih awal atau sama . Saya menggunakan LEFT JOIN alih-alih JOIN sehingga stempel waktu pencarian tidak dihapus ketika tidak ada resulttime sebelumnya di tabel sama sekali.

Dengan DISTINCT ON (x.search_ts) dalam kombinasi dengan ORDER BY x.search_ts, r.resulttime DESC kita mendapatkan resulttime terbesar (atau salah satu yang terbesar) yang lebih kecil atau sama dengan setiap stempel waktu penelusuran.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails:izin ditolak untuk relasi schema_migrations

  2. Bangun wadah buruh pelabuhan postgres dengan skema awal

  3. PostgreSQL - Tetapkan nilai integer ke string dalam pernyataan kasus

  4. Gabungkan kueri pada 50 juta+ tabel baris di PostgreSQL

  5. Perlu dua indeks pada tabel gabungan HABTM?