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

n registros de cada valor

Estas en el tema de n registros de cada valor en el foro de SQL Server en Foros del Web. Buenas Tardes, En un post anterior "un sólo registro de cada valor" plantee una duda y flaviovich me comentaba que crease un hilo aparte. Os ...
  #1 (permalink)  
Antiguo 11/05/2009, 09:10
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 3 meses
Puntos: 0
n registros de cada valor

Buenas Tardes,

En un post anterior "un sólo registro de cada valor" plantee una duda y flaviovich me comentaba que crease un hilo aparte.

Os planteo la duda para ello propongo el escenario. Tengo 2 tablas en la Tabla1 guardo los campos idregistro, fecharegistro, nombreregistro, en la Tabla2 tengo los campos idregistro, participanteregistro, cocheregistro, ...

t1.idregistro y t2.idregistro son los equivalentes.

Supongamos que en la tabla1 (t1) tengo los siguientes datos:
Código:
idregistro  fecharegistro  nombreregistro
1               10/05/2009    Respuesta Rápida
2               11/05/2009    Respuesta Sin Modificar

Y en la tabla2 (t2) los siguientes:
Código:
idregistro   participanteregistro    cocheregistro
1                Park Av                        Mondeo
1                Lord F                          Ibiza
1                Craus                           Toyota
1                Daniel                          Mondeo
2                Juan                             Toledo
2                Pedro                           Malaga
Me gustaria poder seleccionar los 3 primeros registros de cada idregistro de la tabla2 y mostrar:

t1.idregistro, t1.fecharegistro, t1.nombreregistro, t2.participanteregistro, t2.cocheregistro.

Si en lugar de los 3 primeros quisiera mostrar los n primeros segun la necesidad, se podría?

Saludos.

Última edición por elwilly; 13/05/2009 a las 09:36
  #2 (permalink)  
Antiguo 11/05/2009, 09:28
Avatar de danideu  
Fecha de Ingreso: febrero-2005
Ubicación: Barcelona
Mensajes: 213
Antigüedad: 19 años, 3 meses
Puntos: 5
Respuesta: n registros de cada valor

Si no he entendido mal, quieres recuperar 3 registros primeros de un SELECT no?.

Con la función LIMIT puedes recuperar solo 3 registros o los que pongas en LIMIT.

Por ejemplo:

Salida: Recuperamos los 3 primeros registro que cumplan que fecharegistro sea el 01/11/2008. La función LIMIT en este caso esta diciendole que seleccione los registros desde el 0 hasta el 2.

Código mysql:
Ver original
  1. SELECT idRegistro
  2. FROM TUTABLA
  3. WHERE fecharegistro = '01/11/2008'
  4. LIMIT 0,2


Te aconsejo que te leas este artículo.


Espero haberte ayudado.

Saludos.
  #3 (permalink)  
Antiguo 11/05/2009, 09:54
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: n registros de cada valor

Muchas gracias por tu respuesta Danideu,
Pero no es eso lo que busco, quizas no me explique bien. Lo que intento es que el select me devuelva por cada registro de la tabla1 los tres primeros de la tabla2 no sólo los de una fecha en concreto.

Es decir siguiendo con el ejemplo que puse, la tabla1 tiene 2 registros pues me tendría que devolver los tres primeros registros de la tabla2 del idregistro=1 más los 3 primeros registros de la tabla2 del idregistro=2 (tabla1). Todo ello de una vez.

Lo mismo os he liado más.

Saludos,

Roberto.
  #4 (permalink)  
Antiguo 11/05/2009, 11:09
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 16 años
Puntos: 220
Respuesta: n registros de cada valor

Prueba con

select * from tabla1 t1 right outer join tabla2 t2 on (t1.id = t2.idregistro)
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #5 (permalink)  
Antiguo 12/05/2009, 04:56
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: n registros de cada valor

Muchas gracias por tu respuesta Dradi7 pero tampoco devuelve lo que pretendo.
La sentencia me tendría que devolver los siguientes datos

Código:
t1.idregistro |	t1.fecharegistro | t1.nombreregistro |	t2.participanteregistro |	t2.cocheregistro
1 |	10/05/2009 |	Respuesta Rápida |	Park Av |	Mondeo
1 |	10/05/2009 |	Respuesta Rápida |	Lord F |	Ibiza
1 |	10/05/2009 |	Respuesta Rápida |	Craus |	Toyota
2 |	11/05/2009 |	Respuesta Sin Modificar |	Juan |	Toledo
2 |	11/05/2009 |	Respuesta Sin Modificar |	Pedro |	Malaga
Del t1.idregistro=2 sólo me devuelve 2 registro ya que no hay más datos en el ejemplo.

A ver si me podeis echar un cable por más vueltas que le doy no lo consigo.

Saludos,

Roberto.

Última edición por elwilly; 13/05/2009 a las 09:36
  #6 (permalink)  
Antiguo 12/05/2009, 06:22
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: n registros de cada valor

Bueno he llegado a esto

Código:
SELECT T1.IDREGISTRO,T1.FECHAREGISTRO, T1.NOMBREREGISTRO, T2.PARTICIPANTEREGISTRO, T2.COCHEREGISTRO FROM TABLA1 T1 INNER JOIN
(SELECT TOP 3 T3.IDREGISTRO,T3.PARTICIPANTEREGISTRO, T3.COCHEREGISTRO FROM TABLA2 T3
WHERE T3.IDREGISTRO=T1.IDCARRERA 	ORDER BY T3.PARTICIPANTEREGISTRO)AS T2
  ON (T1.IDCARRERA=T2.IDCARRERAFORMA)
Pero me da el siguiente error:

Mens. 4104, Nivel 16, Estado 1, Línea 1
El identificador formado por varias partes "T1.IDREGISTRO" no se pudo enlazar.


Sin embargo si sustituyo T1.IDREGISTRO POR UN NUMERO DE REGISTRO FUNCIONA Y PARA ESE REGISTRO ME DEVUELVE LOS 3 PRIMEROS DE LA TABLA2

Saludos,

Roberto.

Última edición por elwilly; 13/05/2009 a las 09:37
  #7 (permalink)  
Antiguo 14/05/2009, 08:25
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: n registros de cada valor

Nada sigo buscando por la red y no encuentro como hacerlo en SQL.
Por ahí me recomiendan llenar un dataset y trabajar con él. Pero eso consume mucho más tiempo, sino queda más remedio así lo tendré que hacer.

Alguién que se le ocurra una manera diferente de hacerlo?

Muchas gracias.
  #8 (permalink)  
Antiguo 14/05/2009, 09:58
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 9 meses
Puntos: 39
Respuesta: n registros de cada valor

Si quieres n registros necesitas crear una funcion.
Suerte!
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #9 (permalink)  
Antiguo 14/05/2009, 10:45
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: n registros de cada valor

hay alguna llave o identificador en la tabla del Detalle?

algun constraint?

algo como que una misma persona no pueda registrar el mismo carro para el mismo id registro?

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #10 (permalink)  
Antiguo 14/05/2009, 10:53
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: n registros de cada valor

Gracias a ambos por vuestra ayuda,

Andres95 en la tabla detalle cada participante es diferente no puede ser el mismo.

flaviovich mirare lo de las funciones nunca he creado ninguna a ver que tal?

Lo dicho gracias.
  #11 (permalink)  
Antiguo 14/05/2009, 11:15
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: n registros de cada valor

Si los participantes son distintos, podrias utilizar un subquery...

aunque no se como te vaya a pegar en el performance, porque el campo de participante es character, seria mejor con un dato numerico...

tendrias que probar..

Código:
SELECT     T1.IDREGISTRO
         , T1.FECHAREGISTRO
         , T1.NOMBREREGISTRO
         , T2.PARTICIPANTEREGISTRO
         , T2.COCHEREGISTRO 
FROM       TABLA1 T1 
INNER JOIN TABLA2 T2
ON         T1.IDREGISTRO = T2.IDREGISTRO
WHERE      T2.PARTICIPANTEREGISTRO IN 
           (SELECT TOP 3 PARTICIPANTEREGISTRO FROM TABLA2 WHERE IDREGISTRO = T1.IDREGISTRO )
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #12 (permalink)  
Antiguo 14/05/2009, 11:31
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 9 meses
Puntos: 39
Respuesta: n registros de cada valor

No creo que el SELECT TOP 3 este bien, por eso digo que debe crear una funcion, ya que este número sera variable.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #13 (permalink)  
Antiguo 14/05/2009, 11:36
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: n registros de cada valor

si, a mi tampoco me gustan los subqueries, pero sin un id...


y la funcion, que recibiria como parametro?
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #14 (permalink)  
Antiguo 14/05/2009, 11:53
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: n registros de cada valor

A todos Gracias, gracias y mil gracias

Funciona perfectamente!! :))

Ahora para traer los n registros valdria con meterlo en un procedimiento y declarar una variable para el top? Voy a probar

Ya lo comentaba flaviovich, no iba a funcionar para n registros, pero muchas gracias :)

Andres95 cuando te refieres a sin un id, tengo el idregistro, sería necesario otro id diferente?

Saludos,

Roberto

Última edición por elwilly; 14/05/2009 a las 12:17
  #15 (permalink)  
Antiguo 14/05/2009, 12:24
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: n registros de cada valor

si, pero idregistro es una llave foranea, es decir, puede estar repetido,
para este caso se requiere de una llave primaria o column unique, que identifique de manera unica cada uno de los registros en la tabla de detalle...

si es sql 2000 no puedes ponerle una variable tendrias que manejarlo con sql dinamico..

por ejemplo...

Código:
DECLARE @nSQL nvarchar(4000),  @TopN int

SET @TopN = 3


SET @nSQL = N'SELECT     T1.IDREGISTRO '
          + N'          , T1.FECHAREGISTRO '
          + N'          , T1.NOMBREREGISTRO '
          + N'         , T2.PARTICIPANTEREGISTRO '
          + N'         , T2.COCHEREGISTRO  '
          + N'FROM       TABLA1 T1  '
          + N'INNER JOIN TABLA2 T2 '
          + N'ON         T1.IDREGISTRO = T2.IDREGISTRO '
          + N'WHERE      T2.PARTICIPANTEREGISTRO IN  '
          + N'           (SELECT TOP ' + cast(@TopN as varchar) + ' PARTICIPANTEREGISTRO FROM TABLA2 WHERE IDREGISTRO = T1.IDREGISTRO )'


sp_executesql @nSQL
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #16 (permalink)  
Antiguo 14/05/2009, 13:07
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: n registros de cada valor

Entendido, entonces debería crear un campo por ejemplo idcontador en la tabla2 y ya tendría ese registro que identifica de manera única.

Perdón por mi ignorancia:
Una vez lo cree, cuál sería el beneficio a la hora de realizar la subconsulta?.


Muchas gracias.
  #17 (permalink)  
Antiguo 14/05/2009, 13:12
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 5 meses
Puntos: 38
Respuesta: n registros de cada valor

que podriamos utilizarlo en lugar del campo tipo varchar y mejorar el performance de la consulta..

Siempre es mejor filtrar con campos numericos que con campos caracter...


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #18 (permalink)  
Antiguo 14/05/2009, 14:33
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: n registros de cada valor

Claro como el agua!!

Realizaré el cambio entonces.

Muchas gracias.
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 05:32.