2014-11-03 9 views
6

Tabella:Selezione per crescente SQL

id | year |  score 
-----+------+----------- 
    12 | 2011 |  0.929 
    12 | 2014 |  0.933 
    12 | 2010 |  0.937 
    12 | 2013 |  0.938 
    12 | 2009 |  0.97 
    13 | 2010 |  0.851 
    13 | 2014 |  0.881 
    13 | 2011 |  0.885 
    13 | 2013 |  0.895 
    13 | 2009 |  0.955 
    16 | 2009 |  0.867 
    16 | 2011 |  0.881 
    16 | 2012 |  0.886 
    16 | 2013 |  0.897 
    16 | 2014 |  0.953 

output desiderato:

id | year |  score 
-----+------+----------- 
    16 | 2009 |  0.867 
    16 | 2011 |  0.881 
    16 | 2012 |  0.886 
    16 | 2013 |  0.897 
    16 | 2014 |  0.953 

Sto avendo difficoltà nel cercare di punteggi di uscita che stanno aumentando rispetto all'anno. Qualsiasi aiuto sarebbe molto apprezzato.

+0

È l'obiettivo di restituisce tutti i record dal valore più alto della colonna 'id'? –

+1

Quale versione di SQL stai usando? –

+1

vuoi solo restituire il punteggio più alto per ogni anno? – Sablefoste

risposta

7

Quindi si desidera selezionare id = 16 perché è l'unico che ha valori in costante aumento.

Molte versioni del supporto SQL lag(), che possono aiutare a risolvere questo problema. È possibile determinare, per un dato id, se tutti i valori sono in aumento o in diminuzione facendo:

select id, 
     (case when min(score - prev_score) < 0 then 'nonincreasing' else 'increasoing' end) as grp 
from (select t.*, lag(score) over (partition by id order by year) as prev_score 
     from table t 
    ) t 
group by id; 

È quindi possibile selezionare tutti "in aumento" id usando un join:

select t.* 
from table t join 
    (select id 
     from (select t.*, lag(score) over (partition by id order by year) as prev_score 
      from table t 
      ) t 
     group by id 
     having min(score - prev_score) > 0 
    ) inc 
    on t.id = inc.id; 
+0

quindi è per quando lo stesso punteggio conta come un 'aumento'? Se un punteggio ripetuto nel corso del prossimo anno sequenziale non avrebbe dovuto restituire risultati, sarebbe "avere min (punteggio - prev_score)> 0'? – Beth

+0

@Beth. . . Nella mia esperienza, spesso quando si usa la parola "crescente", significa davvero "non-decrescente". Allo stesso modo, "positivo" spesso significa "non negativo". Ma hai ragione, la domanda dice chiaramente aumentando così ho rimosso il '='. –

Problemi correlati