2016-03-18 11 views
1

zusammen, ich habe eine Tabelle mit ähnlichen Werten dazu:Letzten Wert erhalten, die nicht ‚None‘ ist

Name Value Server time 
a None 3/17/2016 11:59:50 PM 
a None 3/17/2016 11:59:36 PM 
a None 3/17/2016 11:59:33 PM 
a March Madness 3/17/2016 11:59:33 PM 
a None 3/17/2016 11:59:19 PM 
b TGIF 3/17/2016 11:59:04 PM 
b None 3/17/2016 11:58:44 PM 
b March Madness 3/17/2016 11:58:29 PM 
b None 3/17/2016 11:58:22 PM 
c None 3/17/2016 11:58:17 PM 
c None 3/17/2016 11:58:15 PM 
c None 3/17/2016 11:58:14 PM 
c None 3/17/2016 11:57:50 PM 
c None 3/17/2016 11:57:33 PM 

Mein Ergebnismenge dies sein sollte:

mit anderen Worten
a March Madness 
b TGIF 
c 0 

So, ich soll den neuesten Wert von Server sortierte bekommen, die nicht ‚None‘ ist und wenn ich nur ‚kein‘ soll es Null

Vielen Dank im Voraus seines

+2

was ich s deine rdbms ?? \t Bitte lesen Sie [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie Ihre Fragequalität verbessern und bessere Antworten erhalten. –

+0

Um Juan Kommentar zu erweitern: Es ist hilfreich, Datenbank Fragen mit der entsprechenden Software (MySQL, Oracle, DB2, ...) und Version, z. 'sql-server-2014'. Unterschiede in Syntax und Funktionen beeinflussen oft die Antworten. – HABO

Antwort

0

Wenn Sie über „c“ nicht darum, eine einfache Möglichkeit, verwendet eine where Klausel:

select t.* 
from t 
where t.servertime = (select max(t2.server_time) 
         from t t2 
         where t2.name = t.name and t2.value <> 'None' 
        ); 

Wenn Sie alle Namen tun wollen, dann können Sie einen Aggregationsansatz verwenden:

select name, max(case when t.value <> 'None' then servertime end), 
     max(case when t.value <> 'None' and seqnum = 1 then value end) 
from (select t.*, 
      row_number() over (partition by name 
           order by (case when t.value = 'None' then 1 else 2 end) desc, 
             servertime desc 
           ) as seqnum 
     from t 
    ) t 
group by name; 

Oder sogar outer apply:

select n.name, t2.serertime, coalesce(t2.value, 0) as value 
from (select distinct name from t) n outer apply 
    (select top 1 t2.servertime, t2.value 
     from t t2 
     where t2.name = n.name and t2.value <> 'None' 
     order by t2.servertime 
    ) t2; 

Ich mag eigentlich diese Methode.

+0

Erhalten Sie '0' für' c'? –

0

SQL Fiddle Demo

Verwendung von SQL nur Sie eine Liste aller Namen erstellen müssen unterschiedliche Verwendung. Dann beitreten, um den MAX (Serverzeit) für jeden Namen zu finden. Dann eine dritte Verbindung, um den Wert zu erhalten. Schließlich werden die NULL 0 wie der Fall für c

SELECT S."Name", 
     T.mtime, 
     CASE WHEN T.mtime IS NULL THEN '0' 
           ELSE YT."Value" 
     END as Value 
FROM (
     SELECT DISTINCT YT."Name" 
     FROM YourTable YT 
    ) S 
LEFT JOIN (
      SELECT "Name", MAX("Server time") as mtime 
      FROM YourTable 
      WHERE "Value" <> 'None' 
      GROUP BY "Name" 
      ) T 
    ON S."Name" = T."Name" 
LEFT JOIN YourTable YT 
    ON YT."Server time" = T.mtime 
    AND YT."Value" <> 'None' 

OUTPUT

| Name |     mtime |   value | 
|------|-------------------------|---------------| 
| a | March, 17 2016 23:59:33 | March Madness | 
| b | March, 17 2016 23:59:04 |   TGIF | 
| c |     (null) |    0 | 

Eine andere Lösung mit einem weniger JOIN, erstellen Sie eine Dummy-Datum C Fall

SELECT TM."Name", 
     TM.mtime, 
     CASE WHEN T."Value" IS NULL THEN '0' 
            ELSE T."Value" 
     END as Value 
FROM ( 
      SELECT "Name", MAX(CASE WHEN t."Value" <> 'None' THEN "Server time" 
                  ELSE '0001-1-1 0:0:0' 
           END) as mtime 
      FROM YourTable t   
      GROUP BY "Name" 
    ) TM 
LEFT JOIN YourTable T 
    ON TM."Name" = T."Name" 
AND (TM.mtime = T."Server time") 
AND T."Value" <> 'None' 
0
select name, value 
from 
(select name, value 
     , row_number() over (partition by name, order by servertime desc) as rn 
    from table 
    where name <> 'None' 
) tt 
where rn = 1 
union 
select name, '0' as 'value' 
from table 
where not exists (select 1 from table where name <> 'None') 
zu lösen
Verwandte Themen