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í:
- Obtener la fila que tiene el valor Máx. Para una columna 33 respuestas
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.