sql >> Databáze >  >> RDS >> Mysql

SQL vrátí 100 náhodných řádků pro každý věk

Můžete použít uživatelem definované proměnné níže, dotaz vám poskytne jeden záznam pro každý odlišný věk, vnitřní dotaz pouze kontroluje stejné věkové skupiny a přiděluje jim pořadí jako pro 4 stejné věkové skupiny (věk =1) pořadí bude 1,2,3 ,4 a když věk =2, číslo pořadí začne znovu od 1 a kde filtr vnějšího dotazu filtruje řádky, aby ukázal, kde je pořadí 1, takže pro každý rozdílný věk dostanete jeden řádek a jsou seřazeny náhodně

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

předpokládejme, že váš spojený dotaz vám poskytne výsledky jako

Ukázkový soubor dat

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

Nyní pomocí vnitřního dotazu v mé odpovědi získáte sady výsledků se sloupcem hodnocení, jak je uvedeno níže

Vnitřní sada výsledků dotazu

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

Jak ve výše uvedené sadě výsledků vidíte pro věk =1 má 3 řádky a jejich pozice jsou různé 1,2,3 stejný příklad pro věk =2 pozice jsou 1,2 stejné pro věk =4, Nyní v mé odpovědi bude vnější dotaz odfiltrujte výsledek, kde pořadí =1, takže konečná sada výsledků bude obsahovat jeden řádek pro každý rozdíl, jak je uvedeno níže, sada výsledků

Konečný výstup

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

Část náhodného řazení se provádí při vnitřním dotazu, jak můžete vidět pořadí podle části ORDER BY i.Age, RAND() nejprve seřadí věk vzestupně a poté pro stejné věkové hodnoty dále seřadí výsledky náhodně. Doufám, že to dává smysl



  1. Má PL/SQL ekvivalentní StringTokenizer jako Java?

  2. Výjimka mySQL:Nelze se připojit k žádnému ze zadaných hostitelů MySQL. přes C#

  3. Jak zakázat omezení cizího klíče v SQL Server (příklady T-SQL)

  4. Neořízne funkce MySQL TRIM konce řádků nebo návrat vozíku?