En el mundo de la programación y el desarrollo de aplicaciones, a veces nos pasa que queremos hacer algo muy sencillo pero no recordamos cómo hacerlo. Pues bien, a mí me ha pasado algo parecido, así que os lo voy a comentar con un breve ejemplo por si a alguien más le pasa, espero que os sirva de ayuda.
A continuación os indico las sentencias SQL generadas para obtener la primera y última fila de una tabla, probados con SQL Server. Para el ejemplo he generado una pequeña tabla de Pedidos con los campos:
- ID del pedido
- Descripción del pedido
- Fecha del pedido
- Cliente
- Dirección de entrega de dicho pedido.
Paso 1: Identificar el criterio de ordenación de la consulta para saber qué datos queremos coger exáctamente.
En este caso realizaremos el ejemplo ordenando los pedidos por fecha, cogiendo así el primer y el último pedido de todos los realizados.
SELECT *
FROM Pedido
ORDER BY Fecha
Paso 2: Obtenemos el primer y el último registro de la consulta
Obtenemos el primer y el último registro. Utilizando la palabra reservada TOP podemos especificar el número de registros que queremos obtener, por lo tanto, realizaremos dos sentencias obteniendo sólo el primer valor. Las dos sentencias solo se diferenciarán en el criterio de ordenación, de modo que en una sentencia obtengamos el primer registro y en la siguiente el último.
Primer registro: Utilizamos ordenación Ascendente (ASC).
Primer registro: Utilizamos ordenación Ascendente (ASC).
SELECT TOP 1 *
FROM Pedido
ORDER BY Fecha ASC
FROM Pedido
ORDER BY Fecha ASC
Último registro: Utilizamos ordenacion Descencente (DESC), para obtener los resultados en orden inverso.
SELECT TOP 1 *
FROM PedidoORDER BY Fecha DESC
Paso 3: Unimos los dos registros devueltos en una única consulta
Para unir las dos consultas en una úncia sentencias utilizaremos UNION:
(
SELECT TOP 1 *
FROM Pedido
ORDER BY Fecha ASC
FROM Pedido
ORDER BY Fecha ASC
)
UNION
(
SELECT TOP 1 *
FROM PedidoORDER BY Fecha DESC
)
Si ejecutamos esta sentencia en SQL Server nos dara el siguiente error:
Incorrect syntax near the keyword 'ORDER'.
Esto se debe a que los UNION no permiten utilizar un ORDER BY en sus consultas, para ello debemos "camuflar" ese ORDER BY en una subconsulta de manera que pueda ejecutarse sin ningún problema
SELECT (
ORDER BY Fecha DESC
SELECT TOP 1 *
FROM Pedido
ORDER BY Fecha ASC
FROM Pedido
ORDER BY Fecha ASC
)
UNION
SELECT (
SELECT TOP 1 *
FROM PedidoORDER BY Fecha DESC
)
El resultado sería el siguiente:
El resultado sería el siguiente:
Chebere buen Tips
ResponderEliminarhey, me haz salvado la vida, no conocía la sentencia top
ResponderEliminargracias por el dato :)
Excelente amigo, gracias me ayudará =)
ResponderEliminarSELECT ID, MAX(FECHA) FROM TABLA
ResponderEliminarGROUP BY ID
ORDER BY ID
UNION
SELECT ID, MIN(FECHA) FROM TABLA
GROUP BY ID
ORDER BY ID
hola... hice el mismo procedimiento en C# y me sale el error "Sólo se puede especificar una expresión en la lista de selección cuando la subconsulta no se especifica con EXISTS." ayuda porfavor
ResponderEliminarGracias Man!
ResponderEliminar