sql >> Databasteknik >  >> RDS >> Mysql

SQL returnerar 100 slumpmässiga rader för varje ålder

Du kan använda användardefinierade variabler nedan. Frågan kommer att ge dig en post för varje distinkt ålder, den inre frågan kontrollerar bara för samma åldrar och ger rang till dem som för 4 samma åldrar (ålder =1) rangen kommer att vara 1,2,3 ,4 och när ålder =2 kommer rangnummer att börja från 1 igen och där filtret för den yttre frågan filtrerar rader för att visa där rangen är 1 så för varje distinkt ålder får du en rad och de ordnas slumpmässigt

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

låt anta att din förenade fråga ger dig resultaten som

Exempel på datauppsättning

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
.....

Om du nu använder den inre frågan i mitt svar får du resultatuppsättningarna med rangkolumnen enligt nedan

Inre frågeresultatuppsättning

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

Som i resultatuppsättningen ovan kan du se för ålder =1 har 3 rader och deras rangordning är olika 1,2,3 samma exempel för ålder =2 rang är 1,2 samma för ålder =4, Nu i mitt svar kommer den yttre frågan filtrera bort resultatet där rank =1 så att den slutliga resultatuppsättningen kommer att innehålla en rad för varje distinkt som se nedan resultatuppsättning

Slutlig utgång

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

Den slumpmässiga beställningsdelen görs vid den inre frågan eftersom du kan se ordningen efter del ORDER BY i.Age, RAND() den kommer först att sortera åldern på stigande sätt och sedan för samma åldersvärden kommer den att sortera resultaten ytterligare slumpmässigt. Hoppas det är vettigt



  1. Konvertera tidsstämpel datatyp till unix tidsstämpel Oracle

  2. HikariCP Postgresql Driver hävdar att de inte accepterar JDBC URL

  3. Hur man får tidigare värde för nollvärden

  4. Hur man kör Skapa tabell DDL med UTFÖR Omedelbart i Oracle Database