2017-12-13 16 views
0

私たちはユーザーのアクティビティのテーブルを持っています。各アクティビティーは、userID、timestamp、およびactivityIDによってログに記録されます。毎日ユーザごとにactivityIDごとに複数の行が存在する可能性があります。T-SQL IDによる最後の日々のタイムスタンプを取得

私たちは、この例のように、具体的な活動は、最後のX日のために、ユーザによって実行された最後の時間を取得されてやろうとしている。

userID timestamp activityID 
3241 10/14/2017 7:17 2 
3241 10/15/2017 8:17 2 
3241 10/16/2017 8:17 2 
4355 10/15/2017 8:17 2 
4355 10/16/2017 8:17 2 
4355 10/17/2017 8:17 2 
1234 10/15/2017 8:17 2 
2236 10/15/2017 8:17 2 
2236 10/16/2017 8:17 2 
2002 10/17/2017 8:17 2 

私は非常に最後の時間を引くことができます活動は、最後のX日以内に日ごとにユーザIDによって行われますが、いませんでした。

select t1.[userID], 
     t2.[mxdate] 
from TableA t1 
inner join 
(
    select max([timestamp]) AS mxdate, 
     [userID] 
    from TableA 
    where activityType = 2 
group by [userID] 
) t2 
    on t1.[userID] = t2.[userID] 
    and t1.[timestamp] = t2.mxdate 

私は、タイムスタンプの日付部分のGROUP BYにさまざまな方法を試してきたが、これまでのところ成功していません。私は毎回の活動とタイムスタンプを取得し続けています。

私は少なくとも正しい方向に向かっていますか?もしそうなら、私はどの駒/句が欠けていますか?

ご協力いただきありがとうございます!

+1

問題のサンプルデータに基づいて、あなたの望ましい結果は何ですか? –

+0

申し訳ありませんが、私は泥としてはっきりしているかもしれません!私が投稿したものは*望ましい結果です。 – luser3228561

答えて

0

あなたのタイムスタンプの日付部分でグループ化することで、あなたはそれぞれの活動の最大のタイムスタンプを取得することができます

;WITH cte (userid, [day], activityid, [timestamp]) AS (
    SELECT t.userid, [day] = CONVERT(NVARCHAR, t.timestamp, 101), t.activityid, MAX(t.timestamp) 
     FROM MyTable t 
    GROUP BY t.userid, CONVERT(NVARCHAR, t.timestamp, 101), t.activityid 
) 
SELECT * 
    FROM cte 
WHERE cte.activityid = 2 

をようようDATEにタイムスタンプ(おそらくDATETIME構造)に変換する必要がありましたテーブルは成長し、あなたは2ヶ月間同じ日にグループ化しない複数の月をカバーします。単一のクエリで派生テーブルを使用して

SELECT t.userid, t.activityid, t.timestamp 
    FROM (SELECT i.userid, i.activityid, maxTS = MAX(i.timestamp) 
      FROM MyTable i 
     GROUP BY i.userid, i.activityid, CONVERT(DATE, i.timestamp)) maxRows 
     INNER JOIN MyTable t 
      ON maxRows.userid = t.userid 
      AND maxRows.activityid = t.activityid 
      AND maxRows.maxTS = t.timestamp 
WHERE t.activity = 2 
+0

私はあなたの答えが気に入っていますが、もっと簡単にすることができます。 CTEを取り出して、あなたの活動フィルタをメインクエリに入れ、それを選択するのではなく、 'GROUP BY CONVERT(DATE、timestamp)'だけにしてください。 –

+0

ありがとう!派生テーブルの答えは完璧です!私たちが間違いなく含める必要がある列がある、または制約がありますが、それは私が適応/更新するのがずっと簡単です。さらに重要なのは、理解すること! – luser3228561

関連する問題