Puedo hacer SELECT TOP (200) ... pero ¿por qué no BOTTOM (200)?
Bueno, para no entrar en filosofía, lo que quiero decir es, ¿cómo puedo hacer el equivalente de TOP (200) pero al revés (desde abajo, como esperarías que hiciera BOTTOM ...)?
SELECT
columns
FROM
(
SELECT TOP 200
columns
FROM
My_Table
ORDER BY
a_column DESC
) SQ
ORDER BY
a_column ASC
Es innecesario. Puede usar
ORDER BY
y simplemente cambiar el orden aDESC
para obtener el mismo efecto.fuente
Lo siento, pero no creo que vea ninguna respuesta correcta en mi opinión.
La
TOP
función x muestra los registros en orden indefinido. De esa definición se deduce que unaBOTTOM
función no se puede definir.Independiente de cualquier índice u orden de clasificación. Cuando haces una
ORDER BY y DESC
, obtienes primero las filas con el valor de y más alto. Si se trata de una identificación generada automáticamente, debería mostrar los registros que se agregaron por última vez a la tabla, como se sugiere en las otras respuestas. Sin embargo:TOP
funciónLa respuesta correcta debería ser que no hay, y no puede haber, un equivalente a
TOP
para obtener las filas inferiores.fuente
Lógicamente
Por ejemplo, seleccione los 1000 inferiores de Empleado:
En T-SQL,
fuente
Parecería que a cualquiera de las respuestas que implementan una cláusula ORDER BY en la solución le falta el punto o no entiende realmente lo que TOP le devuelve.
TOP devuelve un conjunto de resultados de consulta desordenado que limita el conjunto de registros a los primeros N registros devueltos. (Desde una perspectiva de Oracle, es similar a agregar un donde ROWNUM <(N + 1).
Cualquier solución que use un orden, puede devolver filas que también son devueltas por la cláusula TOP (ya que ese conjunto de datos estaba desordenado en primer lugar), dependiendo de qué criterio se usó en el pedido por
La utilidad de TOP es que una vez que el conjunto de datos alcanza un cierto tamaño N, deja de buscar filas. Puede tener una idea de cómo se ven los datos sin tener que buscarlos todos.
Para implementar BOTTOM con precisión, necesitaría buscar todo el conjunto de datos desordenado y luego restringir el conjunto de datos a los N registros finales. Eso no será particularmente efectivo si se trata de mesas enormes. Tampoco necesariamente le dará lo que cree que está pidiendo. El final del conjunto de datos puede no ser necesariamente "las últimas filas insertadas" (y probablemente no lo será para la mayoría de las aplicaciones intensivas de DML).
De manera similar, las soluciones que implementan un ORDER BY son, desafortunadamente, potencialmente desastrosas cuando se trata de grandes conjuntos de datos. Si tengo, digamos, 10 mil millones de registros y quiero los últimos 10, es una tontería pedir 10 mil millones de registros y seleccionar los últimos 10.
El problema aquí es que BOTTOM no tiene el significado que pensamos cuando lo comparamos con TOP.
Cuando los registros se insertan, eliminan, insertan, eliminan una y otra y otra vez, aparecerán algunos espacios en el almacenamiento y, más tarde, se colocarán filas, si es posible. Pero lo que vemos a menudo, cuando seleccionamos TOP, parecen ser datos ordenados, porque es posible que se hayan insertado al principio de la existencia de la tabla. Si la tabla no experimenta muchas eliminaciones, puede aparecer que está ordenada. (por ejemplo, las fechas de creación pueden ser tan antiguas como la propia creación de la tabla). Pero la realidad es que, si se trata de una tabla con muchas eliminaciones, es posible que las N filas TOP no se parezcan a eso en absoluto.
Entonces, la conclusión aquí (juego de palabras) es que alguien que está pidiendo los registros de BOTTOM N no sabe realmente lo que está pidiendo. O, al menos, lo que están pidiendo y lo que realmente significa BOTTOM no son lo mismo.
Entonces, la solución puede satisfacer la necesidad comercial real del solicitante ... pero no cumple con los criterios para ser la PARTE INFERIOR.
fuente
insert
declaración grande para poner filas en una tabla grande sin indexar. (Primero estoy llenando la tabla antes de comenzar a indexarla). Perdí mi sesión de cliente debido a un reinicio o lo que sea, y ahora quiero ver si mis filas recién agregadas están allí. Si la fila 'inferior' de la tabla es una de mis últimas, sé que la operación se completó. Si la fila 'inferior' es otra cosa, bueno, no hay garantías y tengo que escanear toda la tabla para asegurarme ... pero lo más probable es que pueda ahorrar algo de tiempo comprobando rápidamente la 'inferior' al igual que usted puede ' parte superior'.La respuesta actualmente aceptada por "Justin Ethier" no es una respuesta correcta como lo señaló "Protector uno".
Por lo que puedo ver, hasta ahora, ninguna otra respuesta o comentario proporciona el equivalente de BOTTOM (x) que pidió el autor de la pregunta.
Primero, consideremos un escenario en el que se necesitaría esta funcionalidad:
Esto devuelve una tabla de una columna y cinco registros:
Como puede ver: no tenemos una columna de ID; no podemos ordenar por la columna devuelta; y no podemos seleccionar los dos registros inferiores usando SQL estándar como podemos hacer para los dos registros superiores.
Aquí está mi intento de proporcionar una solución:
Y aquí hay una solución más completa:
De ninguna manera estoy afirmando que esta sea una buena idea para usar en todas las circunstancias, pero proporciona los resultados deseados.
fuente
Todo lo que necesita hacer es invertir su
ORDER BY
. Agréguelo o elimíneloDESC
.fuente
El problema de ordenar al revés es que a menudo no hace un buen uso de los índices. Tampoco es muy ampliable si alguna vez necesita seleccionar una cantidad de filas que no están al principio o al final. Una forma alternativa es la siguiente.
fuente
La respuesta de "Tom H" anterior es correcta y me funciona para obtener las 5 filas inferiores.
Gracias.
fuente
prueba esto.
fuente
Se me ocurrió una solución para esto que no requiere que sepas el número de filas devueltas.
Por ejemplo, si desea obtener todas las ubicaciones registradas en una tabla, excepto la última 1 (o 2, o 5, o 34)
fuente
La consulta de una subconsulta simple ordenada de forma descendente, seguida de una ordenación ascendente en la misma columna, funciona.
fuente
Donde ID es la clave principal de TABLE1.
fuente
Primero, cree un índice en una subconsulta de acuerdo con el orden original de la tabla usando:
Luego, ordena la tabla descendiendo por la
RowIndex
columna que has creado en la consulta principal:Y finalmente úselo
TOP
con la cantidad deseada de filas:fuente