entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

consulta de porcentajes

Hola como están tengo una tabla en sql server se llama

dbo.datos_sin_deforest_0  

necesito hacer una consulta que me muestre el 70% de esta tabla de manera aleatoria y el 30% restante que me lo muestre también este es el código que no me funciona

select top 70 PERCENT *
  from dbo.datos_sin_deforest_0 
  where df=0
    union all
  select top 30 PERCENT *
   from dbo.datos_sin_deforest_0
     where df=0 
  order by rand()

se que es una pregunta un tanto sencilla pero me esta volviendo loco agradezco su ayuda

2votos

Leonardo-Tadei comentado

No es una pregunta sencilla... las bases de datos no son trivieles con lo aleatrorio.

Tu estrategia de consulta está mal: TOP 70 te va a dar el primer 70% pero TOP 30 te va a dar también el primer 30%, con lo que deberías tener datos duplicados y no toda la tabla.

Luego, si obtenés el 70% de los registros de forma aleatoria, los que quedan serán los que no están en ese 70% devuelto, lo que requiere un NOT IN y una subquery con el primer subset de resultados.

Lamento no poder ayudarte más, pero nunca usé Microsoft SQL Server (que es lo que supongo que estás usando por la pregunta y por la seintaxis SQL).

Saludos cordiales

1 Respuesta

1voto

carlossevi Puntos63580

Lo puedes hacer guardando el resultado de una de las selecciones RAND() en una tabla temporal de SQL. Es la opción que se me ocurre para tener en cuenta lo seleccionado la primera vez, y que pueda ser excluido la segunda. Ejemplo:

Parto de una tabla básica:

CREATE TABLE mi_tabla (id int, name VARCHAR(255));

Guardar selección del 70%:

select top 70 percent *
into ##tempTable
  from mi_tabla
  order by RAND(convert(varbinary, newid()));

Ver el 70%:

select * from ##tempTable;

Ver el 30% restante:

select *
  from mi_tabla
  where id not in (select id from ##tempTable);

El problema es que si haces UNION, la ordenación no se respeta. Lleva todos los registros y los ordena como quiere, no aparecen primero unos y luego otros. Podrías hacer el UNION agregando alguna columna que sea distinta.

Te dejo enlace a un SQL Fiddle con el ejemplo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta