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

obtener el primero y el segundo de cada grupo

Estas en el tema de obtener el primero y el segundo de cada grupo en el foro de SQL Server en Foros del Web. Hola: Tengo que obtener dos resultados de una serie de registros: a: primer valor de un grupo b: Segundo valor del grupo los registros tienen ...
  #1 (permalink)  
Antiguo 08/04/2010, 10:52
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
obtener el primero y el segundo de cada grupo

Hola:

Tengo que obtener dos resultados de una serie de registros:

a: primer valor de un grupo
b: Segundo valor del grupo

los registros tienen un formato parecido al siguiente:

grupo, nombre, cantidad
1, jj, 4
1, ss, 89
1, rr, 56
2, tt, 55
2,ee,44
2,rr,43



el primer resultado con los primeros de cada grupo serían
1, jj, 4
2, tt, 55

los segundos
1, ss, 89
2,ee,44


como hago la consulta?

Muchas gracias
  #2 (permalink)  
Antiguo 08/04/2010, 11:43
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: obtener el primero y el segundo de cada grupo

Si no tienes un campo que te indique el orden de los registros, podrias agregar un campo identity temporalmente y agruparias por el campo grupo y seleccionas el menor identity.
Suerte!
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 08/04/2010, 12:53
Avatar de moron  
Fecha de Ingreso: mayo-2004
Mensajes: 972
Antigüedad: 19 años, 11 meses
Puntos: 2
Respuesta: obtener el primero y el segundo de cada grupo

Hola, gracias por la respuesta.
Lo resolví de esta forma para obtener el primero. ahora restaría obtener el segundo:


SELECT grupo
,clase
,cant
into maximoDeCadaGrupo
FROM tabla
where indice in (select min(indice) from tabla group by grupo)
order by grupo


Muchas gracias desde ya
  #4 (permalink)  
Antiguo 08/04/2010, 14:54
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: obtener el primero y el segundo de cada grupo

Solo cambiar el IN, por el EXISTS y para obtener le ultimo

(select MAX(indice) from tabla group by grupo)
  #5 (permalink)  
Antiguo 08/04/2010, 17:12
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: obtener el primero y el segundo de cada grupo

No lo he probado:
Código SQL:
Ver original
  1. SELECT grupo,clase,cant
  2. INTO maximoDeCadaGrupo
  3. FROM tabla t
  4. WHERE EXISTS (SELECT top 2 indice FROM tabla WHERE t.grupo=grupo AND t.indice=indice ORDER BY indice)
  5. ORDER BY grupo
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #6 (permalink)  
Antiguo 08/04/2010, 21:23
Avatar de Beakdan  
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 22 años, 3 meses
Puntos: 7
Respuesta: obtener el primero y el segundo de cada grupo

Flaviovich, en la última consulta publicada, antes de agrupar el predicado siempre es true. Pero además, al agrupar debe saltar un error ya que clase y cant no tienen una función de agregado aplicada a dichas columnas.

Moron, no indicaste la versión de SQL Server que usas, pero si estás usando la 2005 o 2008, es muy fácil de solucionar tu problema.

Código:
SELECT        seq.grupo, seq.clase, seq.cant
FROM        (    
                SELECT        ROW_NUMBER() OVER(PARTITION BY grupo ORDER BY indice) AS seq
                            grupo, clase, cant
                FROM        tabla
            ) AS seq
WHERE        seq.seq <= 2;
También podrías usar:
Código:
SELECT        ref.grupo,
            lkp.clase,
            lkp.cant
FROM        (SELECT DISTINCT grupo FROM tabla) AS ref
            CROSS APPLY (
                SELECT    TOP 2
                        clase, cant
                FROM    tabla
                WHERE    grupo = ref.grupo
                ORDER BY indice
            ) lkp;
Saludos

Etiquetas: grupo, primero
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:19.