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

[SOLUCIONADO] Select primeras filas de cada rut

Estas en el tema de Select primeras filas de cada rut en el foro de SQL Server en Foros del Web. Hola a todos, primero me disculpo si estoy cometiendo algun error al publicar esta pregunta, soy nuevo y me registre porque necesito con urgencia ayuda ...
  #1 (permalink)  
Antiguo 14/12/2012, 06:24
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Pregunta Select primeras filas de cada rut

Hola a todos, primero me disculpo si estoy cometiendo algun error al publicar esta pregunta, soy nuevo y me registre porque necesito con urgencia ayuda en esto, bueno les comento:

Tengo esta estructura de tabla con los campos rut, dia, cont

rut ---------- dia -- cont
10000136 ----1 ----- 3
10000136 ---- 5 ----- 1
10000136 ---- 6 ----- 1
10004692 ---- 17 --- 1
10007610 ---- 4 ----- 2
10007610 ---- 9 ----- 1
10007610 ---- 11 --- 1
10007610 ---- 14 --- 1
10009703 ---- 1 ----- 1
10012309 ---- 12 --- 1
10012309 ---- 30 --- 1
10017575 ---- 4 ----- 1
10017575 ---- 10 --- 1
10017575 ---- 22 --- 1

Mi duda es la siguiente, pueden ver que cada rut se repite algunas veces dependiendo de los dias que tengan y el contador de esos dias. Lo que necesito es obtener de cada rut el primer registro, osea que el select que debo hacer me debe devolver esto:

rut ----------- dia --- cont
10000136 ---- 1 ----- 3
10004692 ---- 17 --- 1
10007610 ---- 4 ----- 2
10009703 ---- 1 ----- 1
10012309 ---- 12 --- 1
10017575 ---- 4 ----- 1

El problema esque intente con la funciones max, con contadores, pero por simple o complejo que sea no se me ocurre como hacerlo ajjaj esero puedan ayudarme, Muchas Gracias.
  #2 (permalink)  
Antiguo 14/12/2012, 06:32
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Select primeras filas de cada rut

Podrias poner la select que tienes ahora mismo, es decir, que es lo que estás intentando.

Consejo, dale un vistazo al comando "TOP" ;)
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 14/12/2012, 06:36
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Select primeras filas de cada rut

Hola de hecho ya no estoy intentando nada mas, esque tenia una tabla gigante con mil campos y la pude reducir a eso que ves alli, y eso lo transforme en la tabla que ven alli, y no se me ocurre que tipo de select pueda servir para mostrar lo que quiero :/ y ya le heche un vistazo tambien al comando top, pero me devuelve solo un registro, no me retorna el primero de cada rut :/
  #4 (permalink)  
Antiguo 14/12/2012, 06:51
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Select primeras filas de cada rut

Lo puedes hacer en dos pasos con una subconsulta. Primero agrupar los registros por rutas (esto seria la subconsulta) y luego obtienes el primer dia en que la ruta está en la subconsulta.
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 14/12/2012, 07:11
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Select primeras filas de cada rut

Tambien intente eso ajajaj el problema esque no necesariamente el primer dia es la primera fila, me explico, si para un rut tengo los días 2,8 y 9 la primera fila de ese rut podria ser el 8 o el 9 o tambien el dos, eso varia, por eso va el cont. Porque el select me debe devolver el rut, mas la fila donde este el mayor contador, y si los contadores son iguales entonces me devuelve el primer dia D: esta muy dificil en verdad no se me ocurre, Por eso ordene la tabla de tal forma que el primer registro de cada rut es el que debo retornar. seguire intentando a ver que pasa ;) gracias por la rapida respuessta :D
  #6 (permalink)  
Antiguo 14/12/2012, 07:17
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Select primeras filas de cada rut

Cita:
Iniciado por leo_acn Ver Mensaje
Tambien intente eso ajajaj el problema esque no necesariamente el primer dia es la primera fila, me explico, si para un rut tengo los días 2,8 y 9 la primera fila de ese rut podria ser el 8 o el 9 o tambien el dos, eso varia, por eso va el cont. Porque el select me debe devolver el rut, mas la fila donde este el mayor contador, y si los contadores son iguales entonces me devuelve el primer dia D: esta muy dificil en verdad no se me ocurre, Por eso ordene la tabla de tal forma que el primer registro de cada rut es el que debo retornar. seguire intentando a ver que pasa ;) gracias por la rapida respuessta :D
Pon la consulta de como lo harias. Es fácil y te lo podría hacer en un momento pero entonces no aprenderías y no reflexionarías sobre el porque funciona ;)

Pon el código y luego lo iremos puliendo :)
__________________
Aviso: No se resuelven dudas por MP!
  #7 (permalink)  
Antiguo 14/12/2012, 07:28
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Select primeras filas de cada rut

genial mira intente hacer esto, la tabla donde esta la informacion se llama 'CG_tramodiapago'

select paab_nrorut as rut, dia, cont from cg_tramodiapago where dia = (select top 1 dia from cg_tramodiapago)

Pasa que con la sub consulta con el top 1 me muestra solo el primer registro de toda la tabla, donde el dia es igual a '1' por eso luego al hacer el select si me muestra las primeras filas, pero solo donde el dia es igual a uno, las demas no las muestra
  #8 (permalink)  
Antiguo 14/12/2012, 07:33
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Select primeras filas de cada rut

Vale, como harias una consulta que te sacase todas las rutas (solo el campo "rut") sin repetidos?
__________________
Aviso: No se resuelven dudas por MP!
  #9 (permalink)  
Antiguo 14/12/2012, 07:36
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Select primeras filas de cada rut

que me muestre solo el cmpo rut sin repetirlo? asi:

select distinct paab_nrorut as rut from cg_tramodiapago

o tambien agrupando, pero con el distinct es mas simple :)
  #10 (permalink)  
Antiguo 14/12/2012, 07:43
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Select primeras filas de cada rut

Cita:
Iniciado por leo_acn Ver Mensaje
que me muestre solo el cmpo rut sin repetirlo? asi:

select distinct paab_nrorut as rut from cg_tramodiapago

o tambien agrupando, pero con el distinct es mas simple :)
Ahora, como me sacarias el primer dia de cada ruta? La lista de rutas disponibles la estas generando con la subconsulta que me acabas de poner.

Dicho de otra manera, has de hacer una consulta para sacar el dia cruzando por las rutas (IN) que has generado.

Como lo pondrias?
__________________
Aviso: No se resuelven dudas por MP!
  #11 (permalink)  
Antiguo 14/12/2012, 07:54
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Select primeras filas de cada rut

mmm se me ocurre algo asi

select paab_nrorut, dia from cg_tramodiapago where paab_nrorut in (select distinct paab_nrorut as rut from cg_tramodiapago)

pero aun me sigue repitiendo los registros porque la subconsulta me trae la lista de los rut disponibles, pero al hacer el select cada rut tiene distintos dias, entonces me los repite :/
  #12 (permalink)  
Antiguo 14/12/2012, 08:03
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 3 meses
Puntos: 606
Respuesta: Select primeras filas de cada rut

al hacer la subselect te devuelve de golpe todos los dias de esa ruta, ahora tienes que obtener el minimo. Además, tendras que agrupar (ahora con un group) las rutas de esta select.

O dicho de otra forma ya más directa agrupa (de esta nueva consutla) las rutas y obten el dia minimo
__________________
Aviso: No se resuelven dudas por MP!
  #13 (permalink)  
Antiguo 14/12/2012, 08:14
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Select primeras filas de cada rut

ajajaj si se bien como obtener el dia minimo con el min y agrupando pero no es eso lo que necesito ajajja creo que no me entendiste mucho, necesito el primer registro de cada rut, sea o no el dia minimo, esto es lo que pasa, el cont esta para una cosa, necesito el registro donde este el mayor contador y si los contadores son iguales entonces me entrega el dia minimo, pero si hay un contador mayor, puede ser cualquier dia :S
  #14 (permalink)  
Antiguo 14/12/2012, 09:51
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select primeras filas de cada rut

no entiendo, no entiendo quien me ayuda? ya tienes todo lo necesario para hacer el query, lo que esta haciendo el compañero Malenko esta bien es para que tu solo aprendas como hacer subquerys......pero en vista de que no puedes aqui esta el codigo para sacar lo que necesitas:


Código SQL:
Ver original
  1. CREATE TABLE #rut
  2. (
  3. rut VARCHAR(20),
  4. dia INT,
  5. cont INT
  6. )
  7.  
  8.  
  9. INSERT INTO #rut VALUES('10000136',1,3)
  10. INSERT INTO #rut VALUES('10000136',5,1)
  11. INSERT INTO #rut VALUES('10000136',6,1)
  12. INSERT INTO #rut VALUES('10004692',17,1)
  13. INSERT INTO #rut VALUES('10007610',4,2)
  14. INSERT INTO #rut VALUES('10007610',9,1)
  15. INSERT INTO #rut VALUES('10007610',11,1)
  16. INSERT INTO #rut VALUES('10007610',14,1)
  17. INSERT INTO #rut VALUES('10009703',1,1)
  18. INSERT INTO #rut VALUES('10012309',12,1)
  19. INSERT INTO #rut VALUES('10012309',30,1)
  20. INSERT INTO #rut VALUES('10017575',4,1)
  21. INSERT INTO #rut VALUES('10017575',10,1)
  22. INSERT INTO #rut VALUES('10017575',22,1)
  23.  
  24. SELECT * FROM #rut WHERE CONVERT(VARCHAR(20),dia) + '|' + rut IN
  25. (SELECT CONVERT(VARCHAR(20),MIN(dia)) + '|' + rut FROM #rut GROUP BY rut)

Resultado:
Rut Dia Cont
10000136 1 3
10004692 17 1
10007610 4 2
10009703 1 1
10012309 12 1
10017575 4 1


saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #15 (permalink)  
Antiguo 14/12/2012, 10:09
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Select primeras filas de cada rut

mi querido libras! se muy bien com hacer una subconsulta, pasa que no entienden lo que necesito, deja explicarme mejor, no debo tenerl dia minimo, lo que necesito es tener registro de cada rut donde el contador sea el mayor y en el caso de que los contadores sean iguales, entonces alli me retorna el dia minimo. por eso la pregunta que hice fue como obtener el primer registro de cada rut, porque la tabla ya esta ordenada de tal forma que es el primer registro de cada rut el que necesito, saludos ;)
  #16 (permalink)  
Antiguo 14/12/2012, 10:21
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select primeras filas de cada rut

Medias raras las condiciones jejejeje
Código SQL:
Ver original
  1. CREATE TABLE #rut
  2.     (
  3.     rut VARCHAR(20),
  4.     dia INT,
  5.     cont INT
  6.     )
  7.      
  8.      
  9.     INSERT INTO #rut VALUES('10000136',1,3)
  10.     INSERT INTO #rut VALUES('10000136',5,1)
  11.     INSERT INTO #rut VALUES('10000136',6,1)
  12.     INSERT INTO #rut VALUES('10004692',17,1)
  13.     INSERT INTO #rut VALUES('10007610',4,2)
  14.     INSERT INTO #rut VALUES('10007610',9,1)
  15.     INSERT INTO #rut VALUES('10007610',11,1)
  16.     INSERT INTO #rut VALUES('10007610',14,1)
  17.     INSERT INTO #rut VALUES('10009703',1,1)
  18.     INSERT INTO #rut VALUES('10012309',12,1)
  19.     INSERT INTO #rut VALUES('10012309',30,1)
  20.     INSERT INTO #rut VALUES('10017575',4,1)
  21.     INSERT INTO #rut VALUES('10017575',10,1)
  22.     INSERT INTO #rut VALUES('10017575',22,1)
  23.     INSERT INTO #rut VALUES('10011111',4,5)
  24.     INSERT INTO #rut VALUES('10011111',10,20)
  25.     INSERT INTO #rut VALUES('10011111',12,1)
  26.      
  27.     CREATE TABLE #resultados
  28.     (
  29.     rut VARCHAR(20),
  30.     dia INT,
  31.     cont INT
  32.     )
  33.  
  34.  
  35.     SELECT DISTINCT(rut), IDENTITY(INT,1,1) rn INTO #temp FROM #rut
  36.  
  37.    
  38.     DECLARE @x INT
  39.     DECLARE @rut VARCHAR(20)
  40.     DECLARE @mayor INT
  41.     DECLARE @nuevo INT
  42.     DECLARE @y INT
  43.     DECLARE @dia INT
  44.     DECLARE @tot INT
  45.     SET @x=1
  46.     SET @y=1
  47.     SET @mayor=0
  48.     SET @nuevo=0
  49.    
  50.     while @x<=(SELECT COUNT(*) FROM #temp)
  51.     BEGIN
  52.         SET @nuevo=0
  53.         SET @mayor=0
  54.         SET @y=1    
  55.         SET @tot=0
  56.         SELECT @rut=rut FROM #temp WHERE rn=@x 
  57.         SELECT *,IDENTITY(INT,1,1) rn INTO #temp2 FROM #rut WHERE rut=@rut
  58. --      select * from #rut where rut='10007610'
  59.         while @y<=(SELECT COUNT(*) FROM #temp2)
  60.           BEGIN        
  61.             IF @y=1
  62.                 SELECT @nuevo=cont FROM #temp2 WHERE rn=@y 
  63.             SELECT @mayor=cont FROM #temp2 WHERE rn=@y 
  64.             IF @nuevo<@mayor
  65.                 SET @nuevo=@mayor
  66.             IF @nuevo=@mayor
  67.                 SET @tot=@tot+1        
  68.             SET @y=@y+1
  69.           END
  70.         IF @tot=(SELECT COUNT(*) FROM #temp2)
  71.             SELECT @dia=MIN(dia) FROM #temp2                       
  72.         ELSE
  73.             SELECT @dia=dia FROM #temp2 WHERE cont=@nuevo
  74.         print @tot 
  75.         print @rut
  76.         print @nuevo
  77.         print @dia
  78.         INSERT INTO #resultados  
  79.         SELECT * FROM #rut WHERE rut=@rut AND cont=@nuevo AND dia=@dia  
  80.         DROP TABLE #temp2
  81.         SET @x=@x+1
  82.     END
  83.    
  84.     SELECT * FROM #resultados
  85. --    delete from #resultados
  86.    
  87.     DROP TABLE #resultados
  88.     DROP TABLE #temp
  89.     DROP TABLE #rut
  90.    
  91.    
  92. --------------------------

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 14/12/2012 a las 11:08
  #17 (permalink)  
Antiguo 14/12/2012, 11:35
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Select primeras filas de cada rut

Es una mounstruosidad de sql! ajajaja pero gracias ahora con ese ejemplo seguro podre llegar al resultado que busco, muchas gracias
  #18 (permalink)  
Antiguo 14/12/2012, 19:59
 
Fecha de Ingreso: diciembre-2012
Ubicación: México
Mensajes: 1
Antigüedad: 11 años, 4 meses
Puntos: 1
Respuesta: Select primeras filas de cada rut

Hola amigo, haber si entendi tu problematica y con esto se resuelve


select * from rut a where
dia = (select MIN(dia) from rut b where a.rut=b.rut )


Saludos.
  #19 (permalink)  
Antiguo 17/12/2012, 09:18
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select primeras filas de cada rut

Cita:
Iniciado por jmoya07 Ver Mensaje
Hola amigo, haber si entendi tu problematica y con esto se resuelve


select * from rut a where
dia = (select MIN(dia) from rut b where a.rut=b.rut )


Saludos.
No creo que esa sea la solucion, ya que esta buscando mas de un valor con el minimo y en tu query nada mas regresaria 1 por la clausula =, ahi deberia de ir un in o un exists :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #20 (permalink)  
Antiguo 18/12/2012, 06:24
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
De acuerdo Respuesta: Select primeras filas de cada rut

Cita:
Iniciado por jmoya07 Ver Mensaje
Hola amigo, haber si entendi tu problematica y con esto se resuelve


select * from rut a where
dia = (select MIN(dia) from rut b where a.rut=b.rut )


Saludos.
solucionado completamente gracias al amigo jmoya07, no era la solución total pero me dio la idea que necesitaba para lograrlo ;)

select a.rut, min(a.dia) as dia, a.cont from(
select * from cg_tramodiapago a where
cont = (select max(cont) from cg_tramodiapago b where a.rut=b.rut)
) as a group by a.rut, a.cont order by rut

con ese select obtengo primero el mayor contador y si no uno mayor, entonces me retorna el dia minimo
Muchas gracias!

Etiquetas: cada, filas, registro, rut, select, tabla, campos
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 01:30.