come fare una classifica con un'interrogazione SQL
-
Micheal_Scofield
- Scoppiettante Seguace

- Messaggi: 837
- Iscrizione: lunedì 11 gennaio 2010, 15:28
come fare una classifica con un'interrogazione SQL
Ciao a tutti, sono poco esperto e chiedo a voi.
ho una tabella di valori di questo tipo:
x
x
x
y
y
z
z
z
z
w
w
w
desidererei con un query ottenere questo risultato :
1 | z | 4
2 | x | 3
2 | w | 3
3 | y | 2
a pari COUNT deve essere ordinato in ordine alfabetico.
è possibile farlo? come?
ho una tabella di valori di questo tipo:
x
x
x
y
y
z
z
z
z
w
w
w
desidererei con un query ottenere questo risultato :
1 | z | 4
2 | x | 3
2 | w | 3
3 | y | 2
a pari COUNT deve essere ordinato in ordine alfabetico.
è possibile farlo? come?
- nuzzopippo
- Entusiasta Emergente

- Messaggi: 1638
- Iscrizione: giovedì 12 ottobre 2006, 11:34
Re: come fare una classifica con un'interrogazione SQL
Prova a guardare qua, non ho avuto modo di testarlo (lo farò domani) ma credo che una delle istruzioni riportate :
Sia del tipo che a Te serve
Codice: Seleziona tutto
SELECT nameprd AS "Name Product" , sum(conta) AS "files downloaded", count (itemidcontacts) AS "N.Users"
FROM (SELECT nameprd , count (itemid) AS conta, itemidcontacts FROM contactsdownloads
WHERE createddate > '01-01-2007'
GROUP BY nameprd, itemidcontacts
ORDER BY conta DESC ) AS DL
GROUP BY nameprd
ORDER BY sum(conta) DESC;Fatti non foste a viver come bruti ...
-
Micheal_Scofield
- Scoppiettante Seguace

- Messaggi: 837
- Iscrizione: lunedì 11 gennaio 2010, 15:28
Re: come fare una classifica con un'interrogazione SQL
non capisco come venga fuori la posizione in classifica dalla tua query.
la posizione in classifica nel mio primo esempio è la prima colonna, poi c'è l'elemento e successivamente il numero totale di punti
la posizione in classifica nel mio primo esempio è la prima colonna, poi c'è l'elemento e successivamente il numero totale di punti
- nuzzopippo
- Entusiasta Emergente

- Messaggi: 1638
- Iscrizione: giovedì 12 ottobre 2006, 11:34
Re: come fare una classifica con un'interrogazione SQL
Ed hai perfettamente ragione a non capirla 
Mi stavo studiando una pagina che trovavo interessante rispetto al tuo quesito e sono stato interrotto per chiusura, ho segnalato la pagina, oltre tutto combinando un pasticcio perché la pagina che volevo segnalare era questa, con in particolare la query (presa da questa segnalazione) che trovavo promettente come esempio ma, leggendola meglio ora mi accorgo che non sarebbe efficace perché presupporrebbe un raggruppamento sulla funzione "count()", il che non è possibile.
Era molto interessante principalmente per la funzione "row_number()" che in postgresql permetterebbe di numerare le righe di una query, non la conoscevo ed ho reputato la faccenda abbastanza interessante da meritare una segnalazione. Comunque poco promettente per quel raggruppamento sul count() detto prima.
Strada possibile potrebbe essere tramite una "vista" (VIEW), appena mi sarà possibile cercherò di vedere se ci cavo qualcosa per Te interessante.
Chiedo scusa se per la fretta Ti ho fatto perdere tempo.
Mi stavo studiando una pagina che trovavo interessante rispetto al tuo quesito e sono stato interrotto per chiusura, ho segnalato la pagina, oltre tutto combinando un pasticcio perché la pagina che volevo segnalare era questa, con in particolare la query (presa da questa segnalazione) che trovavo promettente come esempio ma, leggendola meglio ora mi accorgo che non sarebbe efficace perché presupporrebbe un raggruppamento sulla funzione "count()", il che non è possibile.
Era molto interessante principalmente per la funzione "row_number()" che in postgresql permetterebbe di numerare le righe di una query, non la conoscevo ed ho reputato la faccenda abbastanza interessante da meritare una segnalazione. Comunque poco promettente per quel raggruppamento sul count() detto prima.
Strada possibile potrebbe essere tramite una "vista" (VIEW), appena mi sarà possibile cercherò di vedere se ci cavo qualcosa per Te interessante.
Chiedo scusa se per la fretta Ti ho fatto perdere tempo.
Fatti non foste a viver come bruti ...
- thece
- Tenace Tecnocrate

- Messaggi: 13164
- Iscrizione: lunedì 23 aprile 2007, 14:16
- Distribuzione: Debian 12 (Bookworm) - KDE
Re: come fare una classifica con un'interrogazione SQL
su SQL Server (T-SQL) io farei così:
Codice: Seleziona tutto
SELECT
ROW_NUMBER() OVER (ORDER BY T2.Count DESC, T2.SomeColumn) AS Position,
T2.SomeColumn,
T2.Count
FROM
(
SELECT
T1.SomeColumn,
COUNT(T1.SomeColumn) AS Count
FROM SomeTable AS T1
GROUP BY T1.SomeColumn
) AS T2
- nuzzopippo
- Entusiasta Emergente

- Messaggi: 1638
- Iscrizione: giovedì 12 ottobre 2006, 11:34
Re: come fare una classifica con un'interrogazione SQL
... beh, ho fatto qualcosa di simile ma mooolto più arzicocolato, mi son picchiato con postgresql su macchina virtuale 
Definita una tabella
Ho creato una vista
e quindi interrogato la vista
È sempre istruttivo guardare chi ne sa di più o come funziona su sistemi diversi ... proverò a vedere la query di @thece 
Definita una tabella
Codice: Seleziona tutto
Tabella "public.valori"
Colonna | Tipo | Modificatori
---------+----------------------+--------------
dato | character varying(5) | not null
dato
------
x
x
x
x
y
y
z
z
z
w
w
w
(12 rows)
SELECT dato, COUNT(dato) FROM valori
GROUP BY dato
ORDER BY COUNT(dato) DESC;
dato | count
------+-------
x | 4
w | 3
z | 3
y | 2
(4 rows)Codice: Seleziona tutto
CREATE VIEW num_conti(dato, conta)
AS SELECT dato, COUNT(dato) FROM valori
GROUP BY dato
ORDER BY COUNT(dato) DESC;
select * from num_conti;
dato | conta
------+-------
x | 4
w | 3
z | 3
y | 2Codice: Seleziona tutto
SELECT (SELECT COUNT(*) + 1 FROM (SELECT conta FROM num_conti GROUP BY conta ORDER BY conta DESC) b WHERE b.conta > num_conti.conta) AS classifica, dato, conta FROM num_conti ORDER BY conta DESC;
classifica | dato | conta
------------+------+-------
1 | x | 4
2 | w | 3
2 | z | 3
3 | y | 2Fatti non foste a viver come bruti ...
-
Micheal_Scofield
- Scoppiettante Seguace

- Messaggi: 837
- Iscrizione: lunedì 11 gennaio 2010, 15:28
Re: come fare una classifica con un'interrogazione SQL
questa soluzione associa una posizione diversa per un uguale punteggio.thece [url=http://forum.ubuntu-it.org/viewtopic.php?p=4954657#p4954657][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
su SQL Server (T-SQL) io farei così:
Codice: Seleziona tutto
SELECT ROW_NUMBER() OVER (ORDER BY T2.Count DESC, T2.SomeColumn) AS Position, T2.SomeColumn, T2.Count FROM ( SELECT T1.SomeColumn, COUNT(T1.SomeColumn) AS Count FROM SomeTable AS T1 GROUP BY T1.SomeColumn ) AS T2
invece io voglio che le voci a pari punti abbiano la stessa posizione, nel mio esempio vedi che i due record piazzati al secondo posto.
-
Micheal_Scofield
- Scoppiettante Seguace

- Messaggi: 837
- Iscrizione: lunedì 11 gennaio 2010, 15:28
Re: come fare una classifica con un'interrogazione SQL
ci sono soluzioni senza usare Viste?nuzzopippo [url=http://forum.ubuntu-it.org/viewtopic.php?p=4954691#p4954691][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:... beh, ho fatto qualcosa di simile ma mooolto più arzicocolato, mi son picchiato con postgresql su macchina virtuale
Definita una tabellaHo creato una vistaCodice: Seleziona tutto
Tabella "public.valori" Colonna | Tipo | Modificatori ---------+----------------------+-------------- dato | character varying(5) | not null dato ------ x x x x y y z z z w w w (12 rows) SELECT dato, COUNT(dato) FROM valori GROUP BY dato ORDER BY COUNT(dato) DESC; dato | count ------+------- x | 4 w | 3 z | 3 y | 2 (4 rows)e quindi interrogato la vistaCodice: Seleziona tutto
CREATE VIEW num_conti(dato, conta) AS SELECT dato, COUNT(dato) FROM valori GROUP BY dato ORDER BY COUNT(dato) DESC; select * from num_conti; dato | conta ------+------- x | 4 w | 3 z | 3 y | 2È sempre istruttivo guardare chi ne sa di più o come funziona su sistemi diversi ... proverò a vedere la query di @theceCodice: Seleziona tutto
SELECT (SELECT COUNT(*) + 1 FROM (SELECT conta FROM num_conti GROUP BY conta ORDER BY conta DESC) b WHERE b.conta > num_conti.conta) AS classifica, dato, conta FROM num_conti ORDER BY conta DESC; classifica | dato | conta ------------+------+------- 1 | x | 4 2 | w | 3 2 | z | 3 3 | y | 2
- thece
- Tenace Tecnocrate

- Messaggi: 13164
- Iscrizione: lunedì 23 aprile 2007, 14:16
- Distribuzione: Debian 12 (Bookworm) - KDE
Re: come fare una classifica con un'interrogazione SQL
Ops ... è vero, dalla tua richiesta mi è sfuggito questo requisitoMicheal_Scofield [url=http://forum.ubuntu-it.org/viewtopic.php?p=4955205#p4955205][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: questa soluzione associa una posizione diversa per un uguale punteggio.
invece io voglio che le voci a pari punti abbiano la stessa posizione, nel mio esempio vedi che i due record piazzati al secondo posto.
-
Micheal_Scofield
- Scoppiettante Seguace

- Messaggi: 837
- Iscrizione: lunedì 11 gennaio 2010, 15:28
Re: come fare una classifica con un'interrogazione SQL
direi che DENSE_RANK() fa quello che mi serve
grazie lo stesso dell'aiuto

grazie lo stesso dell'aiuto
- thece
- Tenace Tecnocrate

- Messaggi: 13164
- Iscrizione: lunedì 23 aprile 2007, 14:16
- Distribuzione: Debian 12 (Bookworm) - KDE
Re: come fare una classifica con un'interrogazione SQL
Codice: Seleziona tutto
SELECT
DENSE_RANK() OVER (ORDER BY T2.Count DESC) AS Position,
T2.SomeColumn,
T2.Count
FROM
(
SELECT
T1.SomeColumn,
COUNT(T1.SomeColumn) AS Count
FROM SomeTable AS T1
GROUP BY T1.SomeColumn
) AS T2
ORDER BY Position, T2.SomeColumn
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti