Published on

January 6, 2012

Descubriendo el poder de TOP WITH TIES en SQL Server

Como desarrollador de SQL Server, constantemente me sorprendo con las joyas ocultas que existen dentro del lenguaje T-SQL. Recientemente, me encontré con una característica que ha estado presente desde SQL Server 2005, pero de alguna manera logró eludirme hasta ahora. Estoy hablando de la cláusula TOP WITH TIES, y déjame decirte, es un cambio de juego.

Consideremos un escenario en el que tenemos una tabla llamada AggregatedClientRequests, que almacena la cantidad de solicitudes realizadas por diferentes direcciones IP de clientes en un sistema. Nuestro objetivo es identificar las tres direcciones IP de clientes principales que han generado la mayor cantidad de solicitudes. Inicialmente, esto parece una tarea sencilla:

CREATE TABLE AggregatedClientRequests (
    Id INT IDENTITY PRIMARY KEY,
    ClientIp VARCHAR(200) NOT NULL,
    NumOfRequests INT NOT NULL
)

INSERT INTO AggregatedClientRequests (ClientIp, NumOfRequests)
VALUES
    ('1.1.1.1', 5100),
    ('2.2.2.2', 10000),
    ('3.3.3.3', 200),
    ('3.3.3.3', 44000),
    ('4.4.4.4', 2200),
    ('5.5.5.5', 10000),
    ('6.6.6.6', 31000),
    ('7.7.7.7', 100),
    ('8.8.8.8', 300),
    ('9.9.9.9', 10000)

SELECT TOP (3) * FROM AggregatedClientRequests ORDER BY NumOfRequests DESC

A primera vista, la consulta anterior parece darnos el resultado deseado. Sin embargo, al examinar más de cerca, nos damos cuenta de que hay dos direcciones IP de clientes, ‘5.5.5.5’ y ‘9.9.9.9’, que también han generado 10,000 solicitudes. En este caso, queremos incluir estas direcciones IP en nuestro conjunto de resultados, ya que deben considerarse igualmente importantes.

Aquí es donde entra en juego la cláusula TOP WITH TIES. Simplemente agregando esta cláusula a nuestra consulta, podemos lograr el resultado deseado:

SELECT TOP (3) WITH TIES * FROM AggregatedClientRequests ORDER BY NumOfRequests DESC

Con la adición de la cláusula TOP WITH TIES, ahora obtenemos el siguiente resultado:

IdClientIpNumOfRequests
22.2.2.210000
55.5.5.510000
109.9.9.910000

Como puedes ver, la cláusula TOP WITH TIES no solo devuelve las tres direcciones IP de clientes principales, sino que también incluye cualquier fila adicional que tenga el mismo valor que la última fila de las tres principales. En este caso, obtenemos un total de cinco filas devueltas, a pesar de que nuestra cláusula TOP especificaba que solo queríamos tres.

Sin la cláusula TOP WITH TIES, lograr el mismo resultado requeriría una consulta más compleja. Entonces, ¿por qué complicar las cosas cuando puedes lograr el resultado deseado con una simple adición a tu consulta?

La próxima vez que te encuentres necesitando identificar los valores principales en un conjunto de datos, recuerda el poder de la cláusula TOP WITH TIES en SQL Server. Es una herramienta útil que puede ahorrarte tiempo y esfuerzo, permitiéndote centrarte en tareas más importantes.

¡Feliz codificación!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.