2012-04-13 4 views
0

Ich habe eine Tabelle Actions, Schema Schlag:Erhalten Sie die neuesten Datensätze für eine Tabelle, in der das Daten-Delta gespeichert wird?

[Actions] 
ActionID 
Date 
Status <--Nullable, a delta column, only stores value when status changes 

Jetzt möchte ich die letzte Datensatz abzurufen, aber es ist sehr wahrscheinlich, dass Stutus für diesen Datensatz null ist, deshalb möchte ich seine letzten Statusänderung erhalten (geordnet nach Date).

Hier ein Beispiel:

ActionID | Date | Status 
------------------------ 
1  | 04/12| 'Bon' 
2  | 04/13| NULL 
3  | 04/14| NULL 
4  | 04/15| NULL 

und mein letzter Eintrag soll wie folgt aussehen: ActionID: 4, Date: 04/15, Status: 'Bon'

Ich weiß, es ist möglich, mit verschachtelten select-Anweisungen zu tun, aber in meinem realen Tisch, Ich habe ungefähr 10 dieser Spalten, es wird drastisch die Leistung beeinflussen, wenn viele Anfragen wie diese gemacht werden. Ich frage mich, ob es einen einfacheren Weg gibt, es zu tun?

+0

Aktionen aussehen wie eine Append-only-Tabelle. Wenn dies der Fall ist, können die zusätzliche Tabelle "LastAction" und eine einfache Trigger-Aktualisierungstabelle mit den letzten ID- und Nicht-Null-Spalten nützlich sein. –

+0

Wie verhält sich der Datensatz mit ActionID = 4 zum Datensatz mit Status = 'Bon'? –

+0

Grundsätzlich möchte ich den letzten Datensatz in dieser Tabelle abrufen, der 'ActionID = 4' ist, aber sein Status ist * NULL *, also muss er die * NULL * mit '' Bon' 'füllen, weil das der letzte nicht ist -null Datensatz für den Status. – Bonk

Antwort

0

nicht sicher, ob ich verstanden Ihre Regeln, aber versuchen Sie dies:

SELECT TOP 1 
ActionID, 
Date, 
(SELECT TOP 1 Status FROM Actions WHERE Status IS NOT NULL ORDER BY ActionID DESC) AS Status 
FROM Actions 
ORDER BY ActionID DESC 

Sie sagten, Sie 10 Spalten haben .. Wie funktioniert es?

Wie Szenario A)

ActionID | Date | StatusA | StatusB | StatusC 
     1 | 04/11 | DELTA_A | NULL | DELTA_C 
     2 | 04/12 | NULL | DELTA_B | DELTA_C 
     3 | 04/13 | DELTA_A | NULL | NULL 

..then mehr SELECT TOP 1 Subqueries ist nach wie vor beste Wahl Ich denke ..

aber wenn es wie Szenario B)

ActionID | Date | StatusA | StatusB | StatusC 
     1 | 04/11 | NULL | NULL | NULL 
     2 | 04/12 | DELTA_A | DELTA_B | DELTA_C 
     3 | 04/13 | NULL | NULL | NULL 

. .dann können Sie Ihre Anfrage wie folgt "rückgängig machen":

SELECT TOP 1 
(SELECT TOP 1 ActionID FROM Actions WHERE Status IS NOT NULL ORDER BY ActionID DESC) AS ActionID, 
(SELECT TOP 1 Date FROM Actions WHERE Status IS NOT NULL ORDER BY ActionID DESC) AS Date, 
StatusA, 
StatusB, 
StatusC 
FROM Actions 
WHERE StatusA IS NOT NULL -- then StatusB and StatusC are also NOT NULL 
ORDER BY ActionID DESC 

..aber beachten Sie, Sie können leere Ergebnis erhalten, wenn es keine Zeile mit StatusA = NOT NULL gibt.

+0

Danke, das ist meine aktuelle Lösung. Aber ich möchte zu viele verschachtelte Select-Anweisungen vermeiden. weil ich ungefähr 10 Spalten wie diese habe und sie sich gegenseitig ausschließen. – Bonk

+0

Ich habe meine Beispielabfragen oben erweitert .. Schau sie dir jetzt an. – huhu78

0

Vielleicht helfen Ihnen, obwohl ich nicht sicher bin, ob ich Ihre Anforderung verstanden habe:

WITH Actions AS(
    SELECT ROW_NUMBER()OVER(Order By Date DESC)AS DateRank 
     , ActionsID 
     , Date 
     , Status 
    FROM [Actions] 
) 
SELECT TOP 1 a1.ActionsID,a1.Date,a2.Status 
FROM Actions a1 INNER JOIN Actions a2 
    ON a1.DateRank < a2.DateRank AND a2.Status IS NOT NULL 
WHERE a1.DateRank=1 
+0

Beachten Sie, dass die TOP-Klausel redundant ist, da ich sowieso nur den letzten Datensatz auswähle ('a1.DateRank = 1'). –

Verwandte Themen