2009-05-26 9 views
6

**** Actualización: **consulta SQL Server agrupados por valor máximo en la columna de

mediante el Ranking() sobre la sintaxis de partición disponible en MS SQL Server 2005 en efecto, que me señale en la dirección correcta, que (o tal vez debería escribir "I") no puede darme los resultados que necesito sin recurrir a la enumeración de filas en el código.

Por ejemplo, si seleccionamos TOP (1) de la fila, me sale sólo un valor, es decir., La ranura 1. Si utilizo MAX(), entonces me da el valor mejor clasificado para cada ranura .. .que, en mi caso, no funciona, porque si el valor superior de la ranura 2 es NULL, pero está al lado del valor MAX no está vacío, ese es el que yo quiero.

Por lo tanto, no pudiendo encontrar una solución completamente T-SQL, he recurrido a filtrar tanto como sea posible en SQL y luego a enumerar los resultados en código en el lado del cliente.

original:

He estado golpeando advanced T-SQL books, Stackoverflow Google y tratando de encontrar la manera de manejar esta consulta, ya sea mediante el uso de pivotes o mediante el uso de funciones analíticas. Hasta ahora, no he acertado en la combinación correcta.

Tengo programas que están clasificados (mayor valor, mayor precedencia). Cada horario tiene una lista de reproducción de un cierto número de ranuras numeradas con archivos.

Lo que necesito hacer es alinear todos los programas y sus listas de reproducción asociadas, y para cada ranura, tomar el archivo del programa que tenga el valor de clasificación más alto.

así, si tuviera una consulta para un cliente específico con una unión entre las listas de reproducción y los horarios, ordenados por Schedule.Rank DESC, así:

PlaylistId Schedule.Rank SlotNumber FileId 
100    100    1   1001 
100    100    2   NULL 
100    100    3   NULL 
200    80    1   1101 
200    80    2   NULL 
200    80    3   NULL 
300    60    1   1201 
300    60    2   NULL 
300    60    3   2202 
400    20    1   1301 
400    20    2   2301 
400    20    3   NULL 

partir de esto, tengo que encontrar la fileid para la fila clasificada MAX por número de ranura:

SlotNumber FileId Schedule.Rank 
1    1001   100 
2    2301   20 
3    2202   60 

¿Alguna idea sobre cómo hacer esto?

definiciones de la tabla a continuación:

CREATE TABLE dbo.Playlists(
    id int NOT NULL) 

CREATE TABLE dbo.Customers(
    id int NOT NULL, 
    name nchar(10) NULL) 

CREATE TABLE dbo.Schedules(
    id int NOT NULL, 
    rank int NOT NULL, 
    playlistid int NULL, 
    customerid int NULL) 

CREATE TABLE dbo.PlaylistSlots(
    id int NOT NULL, 
    slotnumber int NOT NULL, 
    playlistid int NULL, 
    fileid int NULL) 
+0

+1 solo porque es TAN agradable ver una pregunta hecha de vez en cuando, con todas las tablas relevantes y todo - gracias !!! -) –

+0

Por cierto, el pivote no tiene mucho que ver con eso (eso es acerca de "voltear" cosas para que los valores de fila se conviertan en columnas), así que estoy editando en consecuencia. –

+0

No estoy seguro de si el libro al que se refiere es bueno. Pruebe estos: http://www.sql.co.il/ –

Respuesta

4
SELECT slotnumber, fileid, rank 
FROM 
(
    SELECT slotnumber, fileid, Schedules.rank, RANK() OVER (PARTITION BY slotnumber ORDER BY Schedules.rank DESC) as rankfunc 
    FROM Schedules 
    INNER JOIN PlaylistSlots ON Schedules.playlistid = PlaylistSlots.playlistid 
) tmp 
WHERE rankfunc = 1 
+0

si bien esta respuesta no es exactamente correcta (la función de ventana en los criterios arroja un error), las raíces de esta respuesta me llevaron a la respuesta específica de implementación. –

+0

, ¿podrías publicar la versión exacta (o decirme cómo editar la mía)? como mencioné en un comentario a la respuesta de @mitch, no pude probar esto, por lo que un error (¡afortunadamente menor! -) bien pudo haberse infiltrado, ¡gracias! –

+0

sigue trabajando en la solución, pero para solucionar el problema de la función de ventana, puede envolver toda la selección en una tabla derivada. Todavía no estoy obteniendo los resultados que necesito, pero estoy yendo en la dirección correcta. Cuando tenga una solución funcional, editaré la pregunta original con la respuesta completa. –

1

¿Has mirado en el servidor de SQL (2005 en adelante) PARTITION and RANK características?

+0

He leído acerca de aquellos en SO y los documentos de MSDN ... pero no he podido usarlos con éxito en este momento. –

+0

Son ideales para el problema que ha indicado. –

+0

Sí, estaba ocupada escribiendo el código conciso para una solución basada en particiones incluso cuando llegó tu respuesta, @Mitch (espero que sea correcto, no hay tiempo para probar, lo siento). Entonces, como un tema general de SO, ¿qué es lo mejor? ¿Enseñarle a Todd a pescar mientras estás haciendo, o tratar de darle un pescado como lo estoy haciendo? No es una pregunta retórica, soy bastante nuevo aquí y trato de aprender el estilo de SO viendo lo que hacen los veteranos, pero parece que ambos enfoques son bastante populares: ¡para cualquier comentario! –

0
 

select SlotNumber, FileId, ScheduleRank 
FROM intermediateTable a, 
(
    SELECT SlotNumber, Max(Schedule.Rank) as MaxRank 
    FROM intermediateTable O 
    WHERE FileId is not null GROUP BY SlotNumber) b 
WHERE b.SlotNumber = a.SlotNumber and b.MaxRank = a.Rank 
 

Esta consulta utiliza la salida intermedia para construir la salida final.
¿Esto ayuda?

+0

En mi humilde opinión es de hecho importante también muestran enfoques que son portátiles para otros motores SQL sin características de rangos y particiones, como los suyos, pero no veo dónde se forma la tabla intermedia ni cómo: ¿pueden ustedes por favor editar su respuesta para completar? tx! –

+0

La tabla intermedia es la tabla 1 dada por OP – shahkalpesh

Cuestiones relacionadas