2017-06-27 2 views
1

Ich bin mit Oracle SQL Developer Version 4.0.3.16 Ich habe eine Tabelle wie folgt aus:SQL: Wählen Sie eindeutige Spalte basierend auf Priorität (Hierarchie) und die Verfügbarkeit von anderen Spalten

Name | Value | Sequence 
------ | ------ | ------ 
A  | 12  | 0 
A  | 15  | 1 
A  | 11  | 2 
B  | null | 0 
B  | 5  | 2 
B  | 7  | 3 
C  | 12  | 1 

Ich möchte die Auswahl Zeilen in jeder Namenskategorie mit der kleinsten Sequenznummer und nicht mit dem Wert Null. Aka-Ergebnis wäre

Name | Value | Sequence 
------ | ------ | ------ 
A  | 12  | 0 
B  | 5  | 2 
C  | 12  | 1 

Wenn für den Namen kein Wert verfügbar ist, zeigen Sie Wert als Null mit der kleinsten Sequenznummer an.

+0

Mit welchen rdbms arbeiten Sie? Produkt und Version bitte. –

+0

Oracle SQL Developer Version 4.0.3.16 – Deb

Antwort

1

Wenn Ihr db Unterstützung Tupel Sie ein Tupel und eine in-Klausel mit einer subselect verwenden könnte

select * from 
    my_table 
    where (name, sequnce) in ( 
     select Name, min(sequence) 
     from my_table 
     group by name 
     where value is not null) 
    where Value is not null 

oder für andere DB, beitreten ein

select a.* from 
    my_table a 
    INNER join ( 
     select Name, min(sequence) as min_seq 
     from my_table 
     group by name 
     where value is not null) t on a.name = t.name 
          and a.sequence = t.min_seq 
          and a.name is not null 
0

Wenn ich richtig verstehe, müssen Sie dies:

with the_table(Name , Value , Sequence) as(
select 'A',12  , 0 from dual union all 
select 'A',15  , 1 from dual union all 
select 'A',11  , 2 from dual union all 
select 'B',null , 0 from dual union all 
select 'B',5  , 2 from dual union all 
select 'B',7  , 3 from dual union all 
select 'C',12  , 1 from dual 
) 

-- below is actual query: 

select the_table.* from the_table 
inner join (
    select Name, min(case when Value is not null then Sequence end) as mn, max(Sequence) as mx 
    from the_table 
    group by Name 
) t 
on the_table.Name = t.Name and the_table.Sequence = coalesce(t.mn, t.mx) 

Erhalten Sie Reihen mit kleinsten Sequence für jeden Name, wobei Value nicht null ist. Wenn alle Value s Nullen für name sind, dann rufe Zeilen mit der höchsten Sequence für diesen Namen.

Verwandte Themen