2016-07-08 8 views
2

Meine Tabelle Trace hat die folgenden Spalten:Mit MIN-Funktion mit einer Gruppe von in SQL Server

  • trace_id: Primärschlüssel, int
  • Order_ID: Fremdschlüssel Order (Order_id),
  • status_id int: Fremdschlüssel-Status (status_id), int
  • Trace_Date: Datum
  • Trace_Hour: Zeit
  • Trace_CreationDate: datetime2 (= getdate())

ich für jeden retreive benötigen, um die Mindest (die kleinste) Trace_Date und seine Trace_Hour mit dem Status ‚Geschlossen‘ (Tabelle Status) entspricht.

Die Schwierigkeit für mich ist, wie Sie die richtige Trace_Hour abrufen, weil wir mehr als ein Vorkommen für das gleiche Datum für die gleiche Reihenfolge haben können.

Ein Beispiel mit nur einem Order_ID kann die Situation besser zu verstehen helfen:

Trace_ID Order_ID Status_ID Trace_Date Trace_Hour  Trace_CreationDate 
--------------------------------------------------------------------------------------------------- 
176  502  1   2016-06-22 23:30:00.0000000 2016-07-08 09:18:39.0570000 
177  502  6   2016-06-23 10:00:00.0000000 2016-07-08 09:18:39.0570000 
178  502  37   2016-06-22 22:30:00.0000000 2016-07-08 09:18:39.0570000 

Die status_ID = 1 hat den Status 'Geschlossen'. Also für die Order_id = 502, ich möchte 2016-06-22 als Trace_Date und 23:30:00 für Trace_Hour abrufen.

Ich habe versucht, diese Abfrage zu verwenden:

WITH cte AS 
(
    SELECT 
     Order_ID, MIN(Trace_Date) AS Trace_Date 
    FROM 
     Trace t WITH (nolock) 
    INNER JOIN 
     [Status] s WITH (nolock) ON t.Status_ID = s.Status_ID 
    WHERE 
     s.Closed = 1 
    GROUP BY 
     Order_ID 
) 
SELECT 
    MIN(t.Trace_Date) AS Trace_Date, 
    MIN(Trace_Hour) AS Trace_Hour, 
    t.Order_ID 
FROM 
    Trace t WITH (nolock) 
INNER JOIN 
    cte WITH (nolock) ON t.Order_ID = cte.Order_ID 
         AND t.Trace_Date = cte.Trace_Date 
GROUP BY 
    t.Order_ID 

Diese Abfrage das richtige Ergebnis nicht zurück, weil es 2016-06-22 als Trace_Date (Ok) abruft und 22:30:00 als Trace_Hour, die nicht korrekt ist.

Ich habe keine deterministische Spalte, die ich mit der group by-Klausel verwenden kann, die es mir ermöglicht, die richtige Stunde abzurufen.

Hat jemand eine Idee, wie wir diese Aufgabe erledigen können?

Vielen Dank im Voraus für jede Hilfe

+0

Sie zweite Auswahl sollte aus 'cte' auswählen, nicht aus' Trace', sonst was ist der Punkt von 'cte'? – CompanyDroneFromSector7G

+0

Ich benutze die Tabelle Trace in der zweiten Auswahl, um die Spalte 'Trace_Hour', die nicht in der cte – user3569267

+0

ist ja Entschuldigung sah ich, dass, nachdem ich den Kommentar - versucht zu löschen, aber S/O fehlgeschlagen :( – CompanyDroneFromSector7G

Antwort

0

die TraceHour und TraceDate Felder in einem WAK Durch die Kombination können Sie MIN() nur das Feld und spaltete später Datum und die Uhrzeit aus, wenn die Felder einzeln wieder benötigt werden:

with cte as (
    SELECT Order_ID 
    , min(CAST(TraceDate as DATETIME) + CAST(TraceHour as TIME)) as Trace_DateTime 
    FROM Trace t with (nolock) 
    INNER JOIN [Status] s with (nolock) ON t.Status_ID = s.Status_ID 
    WHERE s.Closed = 1 
GROUP BY Order_ID 
) 

Select cte.Order_ID 
, cast(cte.Trace_DateTime as date) as Trace_Date 
, cast(cte.Trace_DateTime as time) as Trace_Hour, 
From cte 
+0

Vielen Dank a viel steenbergh .. Es funktioniert !! – user3569267