0

次のデータが与えられます:

CardholderID   Source                                   DateTime
-------------- ---------------------------------------- -----------------------
3              2nd_Flr_Ramp_Out_Reader                  2010-06-30 13:58:42.410
3              2nd_Flr_Ramp_In_Reader                   2010-06-30 13:44:22.417
3              2nd_Flr_Ramp_Out_Reader                  2010-06-30 13:41:30.510
3              Lobby_To_Office_Reader                   2010-06-30 13:27:51.407
3              2nd_Flr_Ramp_Out_Reader                  2010-06-30 13:27:31.313
3              2nd_Flr_Ramp_In_Reader                   2010-06-30 13:27:23.203
3              2nd_Flr_Ramp_Out_Reader                  2010-06-29 12:03:04.413
3              2nd_Flr_Ramp_In_Reader                   2010-06-29 09:18:16.417
3              2nd_Flr_Ramp_Out_Reader                  2010-06-28 17:51:08.507
3              2nd_Flr_Ramp_In_Reader                   2010-06-28 12:52:28.403
3              2nd_Flr_Ramp_Out_Reader                  2010-06-28 12:04:36.407
3              2nd_Flr_Ramp_In_Reader                   2010-06-28 09:17:20.407
4              1St_Flr_To_Stairs_Reader                 2010-08-02 09:41:14.403
4              1St_Flr_Door_In_Reader                   2010-08-02 09:41:12.403
4              1St_Flr_Door_Out_Reader                  2010-07-30 18:24:36.400
4              1St_Flr_To_Stairs_Reader                 2010-07-30 14:09:54.403
4              1St_Flr_Door_In_Reader                   2010-07-30 14:09:48.403
4              1St_Flr_Door_Out_Reader                  2010-07-30 13:25:24.407

各cardholderIdの「イン」ソースの最小時間と「アウト」ソースの最大時間を日ごとに取得するにはどうすればよいですか。

私が最初に試したのは

select CardHolderId, min(DateTime) as EarliestSwipe, null as LatestSwipe
from EventTable
where source like '%In_Reader%'
group by cardholderid, CardHolderFirstName, CardHolderLastName,dateadd(dd, (datediff(dd, 0, DateTime)),0)
union 
select CardHolderId, null as EarliestSwipe, max(DateTime) as LatestSwipe
from EventTable
where source like '%Out_Reader%'
group by cardholderid, CardHolderFirstName, CardHolderLastName, dateadd(dd, (datediff(dd, 0, DateTime)),0)

しかし、2つのクエリの結果を組み合わせる必要があります。私の質問は、私が望む結果を得るためにデータをピボットする必要があるのか​​、それとも私が提供した例の軌道にとどまることができるのかということです。よろしくお願いします。

4

1 に答える 1

5

これを試してみてください。

SELECT CardholderID,
    MIN(CASE WHEN source like '%In_Reader%' THEN DateTime ELSE NULL END) as EarliestSwipe,
    MAX(CASE WHEN source like '%Out_Reader%' THEN DateTime ELSE NULL END) as LatestSwipe,
FROM EventTable
GROUP BY CardholderID

追加のGROUPBY値を除外しましたが、追加できると思います。

于 2010-08-02T18:26:44.780 に答える