none
Ordinamento particolare RRS feed

  • Domanda

  • Un saluto a tutti.

    Devo stilare una classifica, pertanto, ho una tabella che contiene i campi:

    Tempo, Pettorale, Cognome, Nome, Società, Note

    Voglio ottenere un elenco che mi mostri prima quelli giunti al traguardo in ordine crescente di tempo e di seguito quelli ritirati in ordine di pettorale.

    Come imposto la query?

    Grazie e ciao

    Giovanni

    venerdì 5 dicembre 2014 22:03

Risposte

  • Giusto per dare un resoconto:
    Fatto chiave e indice su cognome.
    Inserite 1 milione di righe giusto per vedere il numero di letture.

    Entrambe le query hanno il seguente report:
    Table 'Partecipanti'. Scan count 5, logical reads 6823.

    Cambiano tuttavia un po' i piani di esecuzione, proprio per la natura delle funzioni di ranking.

    Come vedi le differenze che ci sono, non pesano. Alla fine, direi che puoi scegliere tra due soluzioni equivalenti.

    ciao


    Alessandro Alpi SQL Server MVP

    venerdì 12 dicembre 2014 16:14
    Moderatore

Tutte le risposte

  • Ciao Giovanni,

    tutto sta a capire come sono i dati di quelli arrivati (immagino che abbiano un tempo) e di quelli ritirati. Questi ultimi, come li distingui? Non hanno il tempo? Hanno un tempo di default? Si può capire da altre cose?


    Alessandro Alpi SQL Server MVP

    sabato 6 dicembre 2014 14:33
    Moderatore
  • Ciao.

    Quelli arrivati hanno, ovviamente, un tempo, mentre quelli ritirati o non partiti il tempo non lo hanno e nelle note viene indicato "ritirato" o "non partito".

    Grazie e ciao

    Giovanni

    domenica 7 dicembre 2014 15:54
  • Vedi se questo esempio può fare al caso tuo.

    http://sqlfiddle.com/#!6/acdbe/5

    La prossima volta ti consiglio di usare SQLFiddle.com per creare lo schema e condividere l'editor della tua query. In questo modo puoi semplicemente creare gli oggetti "reali" e facilitare le nostre risposte.


    Alessandro Alpi SQL Server MVP

    • Proposto come risposta giovagava lunedì 8 dicembre 2014 21:42
    lunedì 8 dicembre 2014 00:15
    Moderatore
  • Ciao.

    Potresti ricorrere alle funzioni di rango.

    Nel tuo caso crei una partizione su Tempo e Pettorale e ordini per rango.

    Ad esempio:

    SELECT
      RANK() OVER (ORDER BY ISNULL(TEMPO,'23:59:59'), PETTORALE) AS ID
      , *
    FROM
      PARTECIPANTI
    ORDER BY
      ID

    vibi6


    • Modificato vibi6 lunedì 8 dicembre 2014 11:45
    • Proposto come risposta giovagava lunedì 8 dicembre 2014 21:42
    lunedì 8 dicembre 2014 11:43
  • Due ottime soluzioni, grazie ad entrambi.

    Ciao

    Giovanni

    lunedì 8 dicembre 2014 21:42
  • Siccome la scelta di una forma o dell'altra dovrebbe essere basata su un'analisi di I/O e di piani di esecuzione, riesci a mandarci l'eventuale set di indici e di chiavi che hai su quella tabella? Perchè le funzioni di rango sono estremamente comode, ma a volte, sono un pochino più pesanti. Ma prima di dire che performa peggio l'una o l'altra, mi piacerebbe capire quali indici hai, sempre che tu non abbia già fatto questo tipo di lavoro.

    Alessandro Alpi SQL Server MVP

    martedì 9 dicembre 2014 08:47
    Moderatore
  • Allora....

    Pettorale come chiave primaria e Cognome indicizzato.

    Ciao

    Giovanni

    giovedì 11 dicembre 2014 13:12
  • Giusto per dare un resoconto:
    Fatto chiave e indice su cognome.
    Inserite 1 milione di righe giusto per vedere il numero di letture.

    Entrambe le query hanno il seguente report:
    Table 'Partecipanti'. Scan count 5, logical reads 6823.

    Cambiano tuttavia un po' i piani di esecuzione, proprio per la natura delle funzioni di ranking.

    Come vedi le differenze che ci sono, non pesano. Alla fine, direi che puoi scegliere tra due soluzioni equivalenti.

    ciao


    Alessandro Alpi SQL Server MVP

    venerdì 12 dicembre 2014 16:14
    Moderatore
  • Siccome Giovanni vuole che la query tiri prima gli atleti giunti al traguardo in ordine crescente di tempo e poi quelli ritirati in ordine di pettorale, farà bene a sostituire il campo Note con il campo Pettorale nella Order By della query suggerita da Alessandro.


    vibi6

    venerdì 12 dicembre 2014 18:15