2016-08-04 4 views
0

私はテーブル内の以下のデータを持っていることでグループ化した後の日付の違いを探すSQL - 複数の列

enter image description here

私は与えられたゲームのために、以下の詳細

  • を知りたいです2つの州の日付(日数)の差を求める
  • 特定のゲームとIDについて、2つの州の平均日を見つける

たとえば ためのゲーム100、およびID 1000のために、我々は、単一のクエリを使用してこれを達成することができます日付の差は4日であるべきであり、avarageは2

すべきですか? `

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 

ありがとう。

+0

を使用することができ、テキストとしてテーブルを投稿してください、それはいくつかのいずれかをコピーして、同様にテストしようとすることができます – TheGameiswar

+0

ませんでしたあなたは "平均"をどのように計算しましたか?違いを2で割っただけですか? –

+0

はい、nで割ったユニークな状態はありません。この場合、2つの状態があります – KeenUser

答えて

-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

は使用できません。別名では使用できません。 – KeenUser

+0

サブクエリー1で試してみてください。 –

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

あなたはSQL Serverの2012を持っている場合、あなたはラグ機能

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