Dapatkan nilai terkini setiap kumpulan berdasarkan masa
Soalan:
Pertimbangkan jadual Oracle berikut:
<code>id date quantity 1 2010-01-04 11:00 152 2 2010-01-04 11:00 210 1 2010-01-04 10:45 132 2 2010-01-04 10:45 318 4 2010-01-04 10:45 122 1 2010-01-04 10:30 1 3 2010-01-04 10:30 214 2 2010-01-04 10:30 5515 4 2010-01-04 10:30 210</code>
Matlamatnya ialah untuk mendapatkan semula nilai terkini (dan cap masanya) mengikut kumpulan id. Output yang dijangkakan hendaklah:
<code>id date quantity 1 2010-01-04 11:00 152 2 2010-01-04 11:00 210 3 2010-01-04 10:30 214 4 2010-01-04 10:45 122</code>
Penyelesaian:
Untuk melakukan ini, buat paparan sebaris yang menyusun kedudukan setiap baris dalam kumpulan id berdasarkan cap masa menurun:
SELECT RANK() OVER (PARTITION BY id ORDER BY ts DESC) AS rnk, id, ts, qty FROM qtys
Kemudian tapis rekod dengan kedudukan 1 untuk mendapatkan nilai terkini:
SELECT x.id, x.ts AS "DATE", x.qty AS "QUANTITY" FROM (SELECT * FROM qtys) x WHERE x.rnk = 1
Pilihan lanjutan:
WHERE x.ts >= sysdate - INTERVAL 'XX' MINUTE
SELECT x.id || '-' || y.idname AS "ID", x.ts AS "DATE", x.qty AS "QUANTITY" FROM (SELECT * FROM qtys) x LEFT JOIN another_table y ON x.id = y.id
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Nilai Terkini untuk Setiap Kumpulan Berdasarkan Cap Masa dalam Oracle?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!