sql >> Base de Datos >  >> RDS >> Mysql

SQL devuelve 100 filas aleatorias para cada edad

Puede usar las variables definidas por el usuario a continuación, la consulta le dará un registro por cada edad distinta, la consulta interna solo verifica las mismas edades y les otorga un rango como para 4 mismas edades (edad =1) el rango será 1,2,3 ,4 y cuando la edad =2, el número de rango comenzará desde 1 nuevamente y donde el filtro de la consulta externa está filtrando filas para mostrar donde el rango es 1, por lo que para cada edad distinta obtendrá una fila y se ordenarán aleatoriamente

SELECT  c.name, c.Gender, c.Age, c.MP, c.score
FROM (
SELECT i.name, i.Gender, i.Age, i.MP, b.score,
@r:= CASE WHEN @g = i.Age THEN @r + 1 ELSE 1 END rownum,
@g:=i.Age
FROM i
INNER JOIN b ON b.name=i.name
CROSS JOIN(SELECT @g:=NULL ,@r:=0) a
WHERE i.MP='F' AND i.gender='F' AND b.score<=-1
ORDER BY  i.Age, RAND()
) c
WHERE c.rownum = 1
ORDER BY c.Age
LIMIT 100

supongamos que su consulta unida le da los resultados como

Conjunto de datos de muestra

name   gender  Age  Mp score
============================
test1  male    1    1   10
test2  male    1    1   10
test3  male    1    1   10
test4  male    2    1   10
test5  male    2    1   10
test6  male    3    1   10
test7  male    4    1   10
test8  male    4    1   10
.....

Ahora, usar la consulta interna en mi respuesta le dará los conjuntos de resultados con la columna de clasificación como se muestra a continuación

Conjunto de resultados de consultas internas

name   gender  Age  Mp score rank
==================================
test2  male    1    1   10    1
test1  male    1    1   10    2
test3  male    1    1   10    3
test4  male    2    1   10    1
test5  male    2    1   10    2
test6  male    3    1   10    1
test7  male    4    1   10    1
test8  male    4    1   10    2

Como en el conjunto de resultados anterior, puede ver que edad =1 tiene 3 filas y sus rangos son diferentes 1,2,3 mismo ejemplo para edad =2 rangos son 1,2 iguales para edad =4, ahora en mi respuesta la consulta externa será filtre el resultado donde rango =1 para que el conjunto de resultados final contenga una fila para cada elemento distinto como se muestra a continuación.

Salida final

name   gender  Age  Mp score rank
==================================
test2  male    1    1   10    1
test4  male    2    1   10    1
test6  male    3    1   10    1
test7  male    4    1   10    1

La parte de orden aleatorio se realiza en la consulta interna, como puede ver el orden por parte ORDER BY i.Age, RAND() primero ordenará la edad de manera ascendente y luego, para los mismos valores de edad, ordenará los resultados aleatoriamente. Espero que tenga sentido