2012-03-27 9 views
4

zu erhalten. Ich möchte die Daten in meinem SQL filtern, so dass ich nur die letzte Zeile für jede Dicke habe, in der das IsReady-Feld wahr ist.SQL-Daten filtern, um für jede alternative ID mit MSSQL

EDIT: Ich bin mit MSSQL 2008-Server für alle, die

Meine Daten wie dies wissen müssen:

+--+----------+-----------+----------+-------+ 
|ID|SupplierID|ThicknessID|DateTime |IsReady| 
+--+----------+-----------+----------+-------+ 
|01|1   |1   |01/01/1990|1  | 
|02|1   |1   |01/01/2012|0  | 
|03|1   |2   |01/01/1990|1  | 
|04|1   |2   |01/01/2012|1  | 

Basierend Aus diesen Daten zur Verfügung gestellt, der SQL-Code zurückkehren soll folgend:

+--+----------+-----------+----------+-------+ 
|ID|SupplierID|ThicknessID|DateTime |IsReady| 
+--+----------+-----------+----------+-------+ 
|01|1   |1   |01/01/1990|1  | 
|04|1   |2   |01/01/2012|1  | 

Hoffnung ist dies genügend Informationen für Sie zu verstehen, wenn nicht nur Kommentar

Antwort

1
SELECT t.* 
FROM Table t 
WHERE IsReady=1 
AND t.ID=(SELECT TOP 1 t2.ID 
      FROM Table t2 
      WHERE t2.IsReady=1 
      AND t.ThicknessID=t2.ThicknessID 
      ORDER BY DateTime DESC) 
+0

Dies hat funktioniert wie ein Charme, danke ein Haufen – JakeJ

2
SELECT A.* FROM TABLE A, 
       (SELECT ThicknessID,MAX(DateTime) AS MaxDateTime 
       FROM TABLE 
       WHERE IsReady=1 
       GROUP BY ThicknessID  
      ) B  
WHERE A.ThicknessID=B.ThicknessID AND 
     A.MaxDateTime = B.DateTime; 
+0

diese SQL-Lauf gibt einen Fehler zurück: 'Kein Spaltenname für die Spalte 2 von‚B angegeben wurde '.' – JakeJ

+0

Jetzt versuchen, es noch einmal auszuführen ... – Teja

+0

Dies gibt nur alle Elemente in meiner Tabelle zurück. Cut's Antwort unten scheint zu funktionieren – JakeJ

0

Sie Angenommen wollen separate Zeilen für jeden SupplierID:

select t.ID, 
    t.SupplierID, 
    t.ThicknessID, 
    t.[DateTime], 
    t.IsReady 
from MyTable t 
inner join (
    select SupplierID, 
     ThicknessID, 
     max([DateTime]) as MaxDateTime 
    from MyTable 
    where IsReady = 1 
    group by SupplierID, 
     ThicknessID 
    ) a on t.ThicknessID = a.ThicknessID 
    and t.SupplierID = a.SupplierID 
    and t.MaxDateTime = a.[DateTime] 
0

Die ausgewählte Abfrage gut funktionieren wird. Aber diese Abfrage wird viel schneller arbeiten und weniger Ressourcen verwenden

select distinct (SupplierID, ThicknessID) * from 
(
    select * from Table1 where IsReady = 1 
    order by [DateTime] desc 
) 

ich das versucht, und es ist viel mehr performant

+0

Diese Abfrage hat mir 2 Fehler zurückgegeben. 'Falsche Syntax in der Nähe des Schlüsselwortes 'on'.' ' Falsche Syntax in der Nähe des Schlüsselwortes' order'.' – JakeJ

+0

Ich benutze hxtt, so dass es auf meiner Datenbank funktioniert. Ich entfernte ON und legte Abdichtungen um DateTime, da datetime ein reserviertes sql Server-Wort ist – Luke101

Verwandte Themen