Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Select para obtener los primeros 3 registros por cada dia

Estas en el tema de Select para obtener los primeros 3 registros por cada dia en el foro de SQL Server en Foros del Web. Que tal, hace tiempo que no hacía selects, tengo un problema. Luego de hacer joins, union, group by y order by al final tengo como ...
  #1 (permalink)  
Antiguo 11/11/2008, 13:04
Avatar de usuariobaneado  
Fecha de Ingreso: diciembre-2007
Mensajes: 402
Antigüedad: 16 años, 4 meses
Puntos: 5
Pregunta Select para obtener los primeros 3 registros por cada dia

Que tal, hace tiempo que no hacía selects, tengo un problema. Luego de hacer joins, union, group by y order by al final tengo como resultado una tabla temporal, llamada #temp, con los siguientes campos:

Fecha, Identificacion, Cliente, direccion, Telefono, Cantidad

La tabla está ordenada por Fecha y por Cantidad, de tal forma que por cada dia primero me muestra las cantidades más altas. Pero me arroja muchos datos, por lo cual quisiera por cada día solo obtener los 3 primeros registros, que son los que tienen las cantidades mayores, de tal forma que solo se conserven los registros en azul:

Código:
Fecha                  Identificacion...  ...otros campos...   ...Cantidad
2008-01-01         xxxxxxx                                               200
2008-01-01         xxxxxxx                                               150
2008-01-01         xxxxxxx                                               130
2008-01-01         xxxxxxx                                               100
2008-01-02         xxxxxxx                                               800
2008-01-02         xxxxxxx                                               400
2008-01-02         xxxxxxx                                               300
2008-01-02         xxxxxxx                                               250
2008-01-02         xxxxxxx                                               200
2008-01-02         xxxxxxx                                               190
2008-01-03         xxxxxxx                                               500
2008-01-03         xxxxxxx                                               200
2008-01-03         xxxxxxx                                               160
2008-01-03         xxxxxxx                                               150
__________________
Yo quiero ser el pelucón del barrio

Última edición por usuariobaneado; 11/11/2008 a las 13:10
  #2 (permalink)  
Antiguo 11/11/2008, 18:29
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Select para obtener los primeros 3 registros por cada dia

Si los campos a tomar en cuenta son Fecha y Cantidad, deberias jugar con un SELECT TOP 3, Fecha, Cantidad FROM..........GROUP BY Fecha ORDER BY Cantidad.............
  #3 (permalink)  
Antiguo 12/11/2008, 09:59
Avatar de usuariobaneado  
Fecha de Ingreso: diciembre-2007
Mensajes: 402
Antigüedad: 16 años, 4 meses
Puntos: 5
Respuesta: Select para obtener los primeros 3 registros por cada dia

Que tal Islas, gracias por la atención. el problema es que si hago un:

SELECT TOP 3 Fecha, Cantidad FROM #Temp GROUP BY Fecha ORDER BY Cantidad

dicho select me devuelve solamente los 3 primeros registros, en cambio lo que necesito es los 3 primeros registros por cada diferente fecha. El TOP me devuelve los 3 primeros registros de todo el set de resultados
__________________
Yo quiero ser el pelucón del barrio
  #4 (permalink)  
Antiguo 12/11/2008, 12:19
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Select para obtener los primeros 3 registros por cada dia

Yo lo haria asi:
Cita:
SELECT T1.*
FROM Hoja1 T1
INNER JOIN (
SELECT T1.Fecha,MAX(T1.Cantidad)[Cantidad]
FROM Hoja1 T1
LEFT JOIN (
SELECT Fecha,MAX(Cantidad)[Cantidad] FROM Hoja1 GROUP BY Fecha
) T2 ON T1.Fecha=T2.Fecha AND T1.Cantidad=T2.Cantidad
LEFT JOIN (
SELECT T1.Fecha,MAX(T1.Cantidad)[Cantidad]
FROM Hoja1 T1
LEFT JOIN (
SELECT Fecha,MAX(Cantidad)[Cantidad] FROM Hoja1 GROUP BY Fecha
) T2 ON T1.Fecha=T2.Fecha AND T1.Cantidad=T2.Cantidad
WHERE T2.Fecha IS NULL
GROUP BY T1.Fecha
) T3 ON T1.Fecha=T3.Fecha AND T1.Cantidad=T3.Cantidad
WHERE T2.Fecha IS NULL AND T3.Fecha IS NULL
GROUP BY T1.Fecha
) T2 ON T1.Fecha=T2.Fecha
WHERE T1.Cantidad>=T2.Cantidad
ORDER BY 1,3 DESC
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #5 (permalink)  
Antiguo 12/11/2008, 12:56
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: Select para obtener los primeros 3 registros por cada dia

Código:
select fecha, cantidad
from
(
 select 
 fecha, 
 cantidad, 
 row_number() over (partition by fecha order by cantidad desc) x
 from t1
  ) alias
where x < 4
order by fecha asc, cantidad desc
Espero estés en Sql Server 2005.

Saludos
  #6 (permalink)  
Antiguo 19/11/2008, 16:51
Avatar de usuariobaneado  
Fecha de Ingreso: diciembre-2007
Mensajes: 402
Antigüedad: 16 años, 4 meses
Puntos: 5
Respuesta: Select para obtener los primeros 3 registros por cada dia

Cita:
Iniciado por matanga Ver Mensaje
Código:
select fecha, cantidad
from
(
 select 
 fecha, 
 cantidad, 
 row_number() over (partition by fecha order by cantidad desc) x
 from t1
  ) alias
where x < 4
order by fecha asc, cantidad desc
Espero estés en Sql Server 2005.

Saludos
Muchas gracias!!!! queda de lujo. No sabía que podía meter un row_number()
__________________
Yo quiero ser el pelucón del barrio
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 08:44.