Query Oracle SQL: recupera gli ultimi valori per gruppo in base al tempo

Ho la seguente tabella in un DB Oracle

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 

ora mi piacerebbe recuperare l’ultimo valore (e il suo tempo) per id. Esempio di output:

 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 

Non riesco a capire come metterlo in una query …

Inoltre, le seguenti opzioni sarebbero belle:

Opzione 1: la query deve restituire solo valori che risalgono agli ultimi XX minuti.

    Opzione 2: l’id dovrebbe essere concatenato con il testo di un’altra tabella che ha id e idname. l’output per id dovrebbe essere come: id-idname (es. 1-testid1).

    molte grazie per qualsiasi aiuto!

    Dati questi dati …

     SQL> select * from qtys 2 / ID TS QTY ---------- ---------------- ---------- 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 9 rows selected. SQL> 

    … la seguente query dà quello che vuoi …

     SQL> select x.id 2 , x.ts as "DATE" 3 , x.qty as "QUANTITY" 4 from ( 5 select id 6 , ts 7 , rank () over (partition by id order by ts desc) as rnk 8 , qty 9 from qtys ) x 10 where x.rnk = 1 11 / 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 SQL> 

    Per quanto riguarda i requisiti aggiuntivi, è ansible applicare ulteriori filtri alla clausola WHERE esterna. Allo stesso modo è ansible unire tabelle aggiuntive alla vista in linea come se fosse un qualsiasi altro tavolo.

    Ecco un esempio completo e testato.

     CREATE TABLE tbl1 (ID NUMBER, dt DATE, quantity NUMBER); DELETE FROM tbl1; insert into tbl1 values (1,to_date('2010-01-04 11:00','YYYY-MM-DD HH24:MI'), 152); insert into tbl1 values (2,to_date('2010-01-04 11:00','YYYY-MM-DD HH24:MI'), 210); insert into tbl1 values (1,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 132); insert into tbl1 values (2,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 318); insert into tbl1 values (4,to_date('2010-01-04 10:45','YYYY-MM-DD HH24:MI'), 122); insert into tbl1 values (1,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 1); insert into tbl1 values (3,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 214); insert into tbl1 values (2,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 5515); insert into tbl1 values (4,to_date('2010-01-04 10:30','YYYY-MM-DD HH24:MI'), 210); SELECT t.ID , t.DT , t.QUANTITY FROM tbl1 t ,( SELECT ID , MAX(dt) dt FROM tbl1 GROUP BY ID ) t2 WHERE t.id = t2.id AND t.dt = t2.dt 

    risultati:

     1 1/4/2010 11:00:00 AM 152 2 1/4/2010 11:00:00 AM 210 3 1/4/2010 10:30:00 AM 214 4 1/4/2010 10:45:00 AM 122 

    Se vuoi ottenere i record per gli ultimi XX minuti, puoi farlo (sto usando 500 minuti in questo esempio, sostituisci il 500 con qualsiasi cosa desideri):

      SELECT t.ID , t.DT , t.QUANTITY FROM tbl1 t ,( SELECT ID , MAX(dt) dt FROM tbl1 WHERE dt >= SYSDATE - (500 / 1400) GROUP BY ID ) t2 WHERE t.id = t2.id AND t.dt = t2.dt;