Query Picante

28/05/2004 - 20:43 por José G. Díaz U. | Informe spam
Saludos y gracias de antemano.

Tengo estos datos:

37 logo-ux.jpg 1 1
38 tit_la_encuesta.gif 2 1
39 encuesta_03.gif 3 0
40 logoCampusxity.gif 4 1
41 ctv.bmp 5 1
42 b1.png 6 1
43 books2a[1].gif 3 1
44 pinup0b[1].gif 1 1
45 starwars[1].gif 5 1
46 slogan.gif 1 1
47 logopeq.gif 1 1

y estos son los campos:

idbanner int
Nombre varchar
IdPosicion int
Activo bit

La idea es seleccionar 6 registros ALEATORIOS cuyo ACTIVO = 1 pero no pueden
repetirse el IdPosicion.

Hasta ahora he logrado esto:

select top 6 *
from banner
where Activo = 1
order by newid()

...y funciona pero me repite los IdPosicion como se puede ver a continuación
(repite en este caso el 1):

44 pinup0b[1].gif 1 1
41 ctv.bmp 5 1
46 slogan.gif 1 1
37 logo-ux.jpg 1 1
42 b1.png 6 1
38 tit_la_encuesta.gif 2 1

Qué cambios tendría que hacer para que no se repita?

Gracias!

Joe

Preguntas similare

Leer las respuestas

#1 Gustavo Larriera [MVP SQL]
28/05/2004 - 20:56 | Informe spam
La query es "picante" dices... no me quiero imaginar el contenido de esas
imágenes!!! :-) :-)

Gustavo Larriera, MVP-SQL, MCSE
Uruguay LatAm
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"José G. Díaz U." wrote in message
news:
Mostrar la cita
pueden
Mostrar la cita
continuación
Mostrar la cita
#2 ulises
28/05/2004 - 21:12 | Informe spam
Hum ... entonces creo que para resolverlo vamos a
necesitar algunos datos para probar ;) ...

Saludos,
Ulises

Mostrar la cita
contenido de esas
Mostrar la cita
no otorga ningun
Mostrar la cita
warranties, and confers
Mostrar la cita
ACTIVO = 1 pero no
Mostrar la cita
puede ver a
Mostrar la cita
#3 José G. Díaz U.
28/05/2004 - 22:02 | Informe spam
:)

Menos acá que de allá :Den realidad le puse picante porque ya me picaba
la cabeza de tanto rascarmela pensando en cómo resolverlo :D

Estos son los datos de la tabla BANNER:

37 logo-ux.jpg 1 1
38 tit_la_encuesta.gif 2 1
39 encuesta_03.gif 3 0
40 logoCampusxity.gif 4 1
41 ctv.bmp 5 1
42 b1.png 6 1
43 books2a[1].gif 3 1
44 pinup0b[1].gif 1 1
45 starwars[1].gif 5 1
46 slogan.gif 1 1
47 logopeq.gif 1 1

Gracias amigos!

Joe

"ulises" escribió en el mensaje
news:148b101c444e7$b47fe030$
Hum ... entonces creo que para resolverlo vamos a
necesitar algunos datos para probar ;) ...

Saludos,
Ulises

Mostrar la cita
contenido de esas
Mostrar la cita
no otorga ningun
Mostrar la cita
warranties, and confers
Mostrar la cita
ACTIVO = 1 pero no
Mostrar la cita
puede ver a
Mostrar la cita
#4 Javier Loria
29/05/2004 - 01:04 | Informe spam
Hola Jose:
Muy bonito problema, prueba con:
SELECT Banner.*
FROM Banner JOIN
(SELECT (SELECT TOP 1 IdBanner
FROM Banner
WHERE IdPosicion=Pos.IdPosicion
ORDER BY NEWID()) AS IdBanner
FROM (SELECT DISTINCT IdPosicion
FROM Banner) AS Pos
) AS B2
ON Banner.IdBanner².IdBanner
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
José G. Díaz U. escribio:
Mostrar la cita
#5 José G. Díaz U.
29/05/2004 - 06:14 | Informe spam
Saludos Javier!

Estaba a un paso :)...tenía soluciones aisladas pero tu las
concentraste!!!..gracias!!

Voy a colocar la explicación de mi razonamiento y si interpreto algo mal te
agradezco me corrjas:

Voy a ponerle un paréntesis y un numerito para que te ubiques en la
explicación en el SELECT pero tu quítaselo cuando lo pases al SP:

SELECT[4] Banner.*
FROM Banner JOIN
(SELECT[3] (SELECT[1] TOP 1 IdBanner
FROM Banner
WHERE IdPosicion=Pos.IdPosicion and Activo = 1
ORDER BY NEWID()) AS IdBanner
FROM (SELECT[2] DISTINCT IdPosicion
FROM Banner) AS Pos
) AS B2
ON Banner.IdBanner².IdBanner

1) Con el Select[1], Select[2] y Select[3] construyes aleatoriamente una
tablita que tiene IdBanner co un una cantidad de registros igual al número
de IdPosicion. Es decir, se crea una lista con el distinct de todas las
posiciones posibles y luego se le asigna aleatoriamente un IdBanner que esté
activo.
2) Finalmente con el Select[4] te relacionas los campitos que te faltan con
la tabla creada en el subquery anterior.

Voy a exponer la idea de esto ya que creo que muchos de los que trabajamos
con Banners para los patrocinantes pueden ver una oportunidad con este
código:

La idea es poder variar aleatoriamente los banners que aparecen en una
página web. Cada IdPosicion referencia un banner en la página en cuestión.
Con esto uno se quita el dolorcito de cabeza de tener que estar editando la
página para cambiar los banners.

Javier una vez más gracias por tu ayuda!

Joe

"Javier Loria" escribió en el mensaje
news:
Mostrar la cita
Ads by Google
Search Busqueda sugerida