optimizar multiple funciones ejemplos dinamico consultas columns 11g sql oracle greatest-n-per-group top-n

sql - multiple - pivot oracle columns to rows



Consulta de Oracle SQL: recupera los últimos valores por grupo en función del tiempo (2)

Esta pregunta ya tiene una respuesta aquí:

Tengo la siguiente tabla en un Oracle DB

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

ahora me gustaría recuperar el último valor (y su tiempo) por id. Ejemplo de salida:

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

Simplemente no puedo descifrar cómo poner eso en una consulta ...

Además, las siguientes opciones serían agradables:

Opción 1: la consulta solo debe devolver valores de los últimos XX minutos.

Opción 2: la identificación debe concatenarse con el texto de otra tabla que tenga id y idname. salida para id debe ser así: id-idname (ej. 1-testid1).

¡Muchas gracias por cualquier ayuda!


Aquí hay un ejemplo completo y probado.

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

Resultados:

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

Si desea obtener los registros de los últimos XX minutos, puede hacerlo (estoy usando 500 minutos en este ejemplo, reemplace el 500 con lo que desee):

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;


Teniendo en cuenta esta información ...

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 siguiente consulta da lo que quieres ...

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>

Con respecto a sus requisitos adicionales, puede aplicar filtros adicionales a la cláusula WHERE externa. De manera similar, puede unir tablas adicionales a la vista en línea como si fuera cualquier otra tabla.