Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    168

    [Mysql] selezionare 50% dei valori

    Ciao ragazzi, vorrei tradurre la seguente query in mysql:

    select top 50 percent value
    from tabella
    order by value

    non mi sembra che la LIMIT supporti le percentuali, quindi vi chiedo: come posso fare?

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    codice:
    select @limite := round(count(*) / 2) from tabella;
    prepare stmt from 'select * from tabella order by value desc limit ?';
    execute stmt using @limite;

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    168
    Sto cercando di calcolare la mediana. Ci sono riuscita nel caso si considerino righe di numero dispari ma sto avendo delle difficoltà nel caso in cui debba trattare righe di numero pari.
    In giro ho trovato questa versione:


    codice:
    select avg(valore) from
    (select valore from(
    select top 1 valore=valore *1.0 from
    (select top 50 percent valore
    from tabella
    order by valore
    )sub_a
    order by 1 desc
    )sub_1
    union all
    select valore from(
    select top 50 percent valore
    from tabella
    order by valore desc
    )sub_b
    )median
    Non riesco a tradurlo in maniera funzionante per vedere se mi fornisce il risultato che vorrei! Mi date una mano?

  4. #4

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    168
    grazie per il link, ma purtroppo il codice mi restituisce null come risultato.
    Non capisco il significato di:

    HAVING SUM(SIGN(1-SIGN(y.val-x.val))) = (COUNT(*)+1)/2

    e nello specifico di

    SUM(SIGN(1-SIGN(y.val-x.val)))

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Non ho provato tutte le soluzioni proposte. Ho verificato quella scritta da Franz K.

    codice:
    SELECT x.id, x.val from data x, data y
          GROUP BY x.id, x.val
          HAVING SUM(SIGN(1-SIGN(IF(y.val-x.val=0 AND x.id != y.id, SIGN(x.id-y.id), y.val-x.val)))) IN (ROUND((COUNT(*))/2), ROUND((COUNT(*)+1)/2))
    e mi sembra che funzioni perfettamente, restituendo un valore nel caso in cui il numero di record sia dispari o due nel caso sia pari.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    168
    Ok, funziona nel caso i valori di "val" siano distinti.
    Però, nel caso in cui i valori di "val" coincidono il funzionamento non è corretto. Mi spiego meglio: se ho

    id val
    1 2
    2 1
    3 3
    4 21
    5 4
    6 5
    7 7
    8 5

    anzichè restituirmi:

    id val
    5 4
    6 5

    mi restituisce:

    id val
    5 4
    6 5
    8 5

    E nel caso:

    id val
    1 2
    2 1
    3 3
    4 21
    5 5
    6 5
    7 7

    anzichè restituirmi:

    id val
    5 5

    mi restituisce

    id val
    5 5
    6 5

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Sicuramente stai sbagliando qualcosa perchè la query restituisce le mediane corrette.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    168
    E se volessi fare la stessa cosa che volevo fare con la media nel post:

    http://forum.html.it/forum/showthrea...readid=1434418

    come cambia il codice?

  10. #10
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    1) Non ho capito cosa vuoi fare.
    2) Prova un pò per conto tuo e poi se non riesci posta quanto hai fatto e dove ti blocchi. Finchè continui ad aspettare che ti venga fatto tutto dalla a alla z non imparerai niente.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.