2016-04-25 12 views
-3

Ich möchte max. und min. Tage zwischen mehreren Datensätzen in meiner Tabelle. Zum Beispiel möchte ich in der folgenden Tabelle max. und min. Tage aufgrund des Datumsfeldes für jede ID. Ich benutze MS-SQL 2013Finde maximale und minimale Tage zwischen mehreren Daten in SQL

Ich weiß, dass es dateiff Tage zwischen zwei Daten zu finden gibt, aber jetzt möchte ich maximale und minimale Tage zwischen mehreren Daten finden.

ID DATE 
10 2016/01/13 
10 2016/01/10 
10 2016/11/01 
10 2015/12/28 
11 2015/12/11 
11 2016/02/01 
11 2015/01/01 

Nun, wie kann ich max. und min. Tage zwischen den DATEN für jede ID?

Können Sie mir bitte helfen, die Abfrage in SQL zu haben?

+3

Was ist das erwartete Ergebnis? –

+0

Wenn Sie die Tage zwischen zwei Daten betrachten, dann gibt es keine MAX oder MIN, es ist ein statischer Wert. Sie sind nicht sehr klar in Ihrer Frage, könnten Sie die Ausgabe, die Sie erwarten, klären. P.S. Vielleicht möchten Sie Ihre SQL-Version überprüfen, 2013 ist soweit ich weiß, keine gültige Version (von 2012 bis 2014). –

Antwort

1

Ok, ich habe wieder lesen Ihre Antwort, suchen Sie so etwas wie unten;

Temporäre Tabelle erstellen und Daten einfügen;

CREATE TABLE #DataTable (ID int, DATE DateTime) 

INSERT INTO #DataTable (ID, DATE) 
VALUES 
(10, '2016-01-13') 
,(10, '2016-01-10') 
,(10, '2016-11-01') 
,(10, '2015-12-11') 
,(11, '2015-12-11') 
,(11, '2016-02-01') 
,(11, '2015-01-01') 

Anweisung auswählen, um Daten abzurufen;

DECLARE @StartDate DateTime; SET @StartDate = '2015-12-01' 
DECLARE @EndDate DateTime; SET @EndDate = '2016-12-01' 

SELECT 
a.ID 
,MIN(DATE) FirstDate 
,MAX(DATE) LastDate 
,DATEDIFF(day, MIN(DATE), MAX(DATE)) DayDiff 
FROM #DataTable a 
WHERE a.DATE BETWEEN @StartDate AND @EndDate 
GROUP BY a.ID 

Sie können die Felder Firstdate und lastdate entfernen, das ist nur die Daten anzuzeigen, die verglichen werden. Sie erhalten einen Wert von 0 zurück, wenn zwischen Ihren variablen Daten nur ein Datum liegt. Sie müssen dies möglicherweise berücksichtigen. Wahrscheinlich auch eine gute Idee, etwas nach NULL zu suchen.

1

Haben Sie versucht:

Select ID, Min(Date), Max(Date) From MyTable Group By ID 
3

Diese Lösung ist ein bisschen hässlich (zwei Unterabfragen verwenden), aber sollte Ihnen den Einstieg:

CREATE TABLE #DataTable (id INT, [date] DATETIME) 

INSERT INTO #DataTable (id, [date]) 
VALUES (10, '20160113') 
    ,(10, '20160110') 
    ,(10, '20161101') 
    ,(10, '20151211') 
    ,(11, '20151211') 
    ,(11, '20160201') 
    ,(11, '20150101') 

SELECT 
    id 
    , MIN([days]) AS mindays 
    , MAX([days]) AS maxdays 
FROM (
    SELECT 
     id 
     , DATEDIFF(DAY, [date], (SELECT MIN([date]) FROM #DataTable AS D1 WHERE D1.id = #DataTable.id AND D1.[date] > #DataTable.[date])) AS [days] 
    FROM #DataTable 
) AS t 
GROUP BY id 
ORDER BY id 

Der einfachste Weg ist, indem ab der Mitte Abfrage zu verstehen (die auf seinem eigenen ausgeführt werden kann). Sie liefert für jede Zeile die ID und die Anzahl der Tage zwischen dem Datum in der Zeile und dem nächsthöheren derselben ID.

Die äußere Abfrage ist dann eine einfache MIN MAX GROUP BY.

Verwandte Themen