2016-08-04 13 views
0

Ich habe die unten Daten in einer TabelleSQL - Der Unterschied in Daten, nachdem sie von mehreren Spalten Gruppierung

enter image description here

Ich mag die folgenden Details erfahren

  • Für ein gegebenes Spiel und ID, Finde den Unterschied zwischen Datum (als Tage) für die 2 Staaten
  • Für ein bestimmtes Spiel und eine ID, finden Sie das durchschnittliche Datum zwischen den beiden Zuständen

Zum Beispiel für Game 100 und ID 1000, Differenz zwischen diesen Zeitpunkt sollen 4 Tage sein, und avarage soll 2.

sein Können wir das eine einzelne Abfrage erreichen? `

Game ID State Date 
100 1000 1111 5/6/2016 
101 1001 1111 5/7/2016 
102 1002 1111 5/8/2016 
103 1003 1111 5/9/2016 
100 1000 2222 5/10/2016 
101 1001 2222 5/11/2016 
102 1002 2222 5/12/2016 
103 1003 2222 5/13/2016 

Vielen Dank.

+0

Bitte senden Sie die Tabelle als Text verwenden könnte, erlaubt es einige zu kopieren und versuchen, so gut – TheGameiswar

+0

zu testen Did not Wie hast du den "Durchschnitt" berechnet? Nur die Differenz von 2 geteilt? –

+0

Ja, geteilt durch n Nein von einzigartigen Staaten, in diesem Fall gibt es 2 Zustand – KeenUser

Antwort

-1
SELECT g1.Game, g1.ID 
    , DateDiff(dd,g1.[Date], g2.[Date]) as Diff 
    , DateDiff(dd,g1.[Date], g2.[Date])/(SELECT COUNT(DISTINCT [State]) as States FROM Games) as DiffAvg 
FROM Games as g1 
INNER JOIN Games as g2 
ON g1.Game = g2.Game and g1.ID = g2.ID 
ORDER BY g1.Game, g1.ID 
+0

es sagt Verwendung von über ist nicht mit verschiedenen .. – KeenUser

+0

Versuchen Sie es mit Sub-Abfrage ein. –

0
DECLARE @tbl TABLE (
    Game INT 
    ,ID INT 
    ,STATE INT 
    ,DATE DATE 
    ); 

INSERT INTO @tbl 
VALUES (100,1000,1111,'5/6/2016'),(101,1001,1111,'5/7/2016'), 
(102,1002,1111,'5/8/2016'),(103,1003,1111,'5/9/2016'), 
(100,1000,2222,'5/10/2016') 
,(101,1001,2222,'5/11/2016'),(102,1002,2222,'5/12/2016'), 
(103,1003,2222,'5/13/2016') 

--select * from @tbl 

SELECT state1.game 
,state1.ID 
,state1.STATE 
,state2.state 
,state1.DATE as '1111Date' 
,state2.Date as '2222Date' 
,datediff(dd, state1.DATE, state2.DATE) AS 'DateDiff' 
,datediff(dd, state1.DATE, state2.DATE)/2 as 'Avg days' 
FROM (
    SELECT game,id,STATE,DATE 
    FROM @tbl) state1 
INNER JOIN (
    SELECT game,id,STATE,DATE 
    FROM @tbl) state2 ON state1.Game = state2.Game 
     AND state1.ID = state2.ID 
WHERE datediff(dd, state1.DATE, state2.DATE) > 0 
0

, wenn Sie SQL Server 2012 haben Sie Nacheilfunktion

DECLARE @tbl TABLE (
    Game INT 
    ,ID INT 
    ,STATE INT 
    ,DATE DATE 
    ); 

INSERT INTO @tbl 
VALUES (100,1000,1111,'5/6/2016'),(101,1001,1111,'5/7/2016'), 
(102,1002,1111,'5/8/2016'),(103,1003,1111,'5/9/2016'), 
(100,1000,2222,'5/10/2016') 
,(101,1001,2222,'5/11/2016'),(102,1002,2222,'5/12/2016'), 
(103,1003,2222,'5/13/2016') 

select * from (
select * 
,lag(state,1,null) over (partition by Game,ID order by [date] desc) state2 
,lag(Date,1,null) over (partition by Game,ID order by [date] desc) date2 
,datediff("dd",[date],lag(Date,1,null) over (partition by Game,ID order by [date] desc)) [days] 
,datediff("dd",[date],lag(Date,1,null) over (partition by Game,ID order by [date] desc))/2 ave 
from @tbl 
) x 
where date2 is not null