Ordenación múltiple en una consulta esquiuel ©

Wei-Yu

Tengo que sacar unos resultados ordenados de la base de datos (sql server ) y estoy aquí pensando que le he dado vueltas de más al problema y que hay una forma más fácil de resolverlo, así que a ver si alguien lo haría distinto. Me invento el "espacio" del problema así que perdonad la falta de imaginación:

Tengo una tabla con pedidos y otra con una especie de histórico de cambios sobre dichos pedidos (cambios como por ejemplo preparar el pedido, cancelarlo, enviarlo, etc).

Lo que quiero es sacar el histórico ordenado por el cambio más reciente, pero agrupado por el pedido, para poder ver el último cambio pero manteniendo "la localidad del pedido", por ejemplo:

Pedido 37 - enviado - 10pm
Pedido 37 - recibido - 9pm
Pedido 25 - preparado - 9.30pm
Pedido 25 - recibido - 8pm

Y para sacar esto lo que hago es meterle una CTE con una agregación por group by en la que ordeno por fecha, luego le asigno pesos (básicamente el row number de la CTE) y eso con un join lo uso como filtro para la ordenación. Algo así

spoiler

De qué otras formas se podría hacer? No puedo evitar tener la sensación de que estoy olvidándome de algo y que esto en realidad es una query de dos líneas xd

Si la idea de pedidos/histórco es algo liosa, a grandes rasgos se reduce ordenar primero por fecha y luego por un ID no único, pero mantener los IDs no únicos juntitos respetando esa ordenación inicial por fecha

1
1 comentario moderado
Fyn4r

Igual estoy loco pero

SELECT p.id, ph.state, ph.date FROM pedido p JOIN pedido_historico ph ON p.id = ph.pedido_id ORDER BY p.id, ph.date DESC;

? xD

5 2 respuestas
Mkay

mkay

1 respuesta
Wei-Yu

ves, si sabía que estaba haciendo el retrasao

con un self join sobre el histórico me basta, no tengo ni que tirar de la tabla de pedidos para nada, pero se me metió entre ceja y ceja moverlo por una CTE por algún motivo

#4 lo de la rownumber era a modo de parche porque cuando me senté a pensarlo me dio por pensar en sacar un árbol del listado plano (no me preguntes por qué) y una vez que me puse esas gafas a estas horas suerte

MTX_Anubis

lo de #3 no funciona a nada que tengas varios historicos asociados a un pedido (que los tendrás)

Pero sí funciona metiendole un group by o con una subquery en vez de un join.

Wei-Yu

lo gracioso es que pensé que esa query iba a ordenar por ID, que es algo que no quiero, luego me dio por ejecutarla y por algún motivo la pasé por válida mentalmente

si a alguien le viene bien un ejemplo con datos:

self join
con pesos via cte

lo de la subquery al final es lo que estoy haciendo con la CTE

voy a levantar el culo y quitarme la pantalla de delante que me va a venir bien

Mandarino

Se que usas sql server, pero en postgres esto es bastante facil utilizando DISTINCT ON. Es como hacer group by y seleccionar 1 row de cada grupo.

Lo dejo ahi como dato xD

1

Usuarios habituales

  • Mandarino
  • Wei-Yu
  • MTX_Anubis
  • Mkay
  • Fyn4r
  • eondev