プロジェクトチームのステータスボードモジュールを作成しています。ステータスボードを使用すると、ユーザーは自分のステータスをインまたはアウトとして設定でき、メモを提供することもできます。私はすべての情報を1つのテーブルに保存することを計画していました...データの例は次のとおりです。
Date User Status Notes
-------------------------------------------------------
1/8/2009 12:00pm B.Sisko In Out to lunch
1/8/2009 8:00am B.Sisko In
1/7/2009 5:00pm B.Sisko In
1/7/2009 8:00am B.Sisko In
1/7/2009 8:00am K.Janeway In
1/5/2009 8:00am K.Janeway In
1/1/2009 8:00am J.Picard Out Vacation
データをクエリし、各ユーザーの最新のステータスを返します。この場合、クエリは次の結果を返します。
Date User Status Notes
-------------------------------------------------------
1/8/2009 12:00pm B.Sisko In Out to lunch
1/7/2009 8:00am K.Janeway In
1/1/2009 8:00am J.Picard Out Vacation
これを実現するためにTRANSACT-SQLを理解しようとしていますか?任意の助けをいただければ幸いです。
に集約 サブクエリ 派生テーブルと結合します。
Select Date, User, Status, Notes
from [SOMETABLE]
inner join
(
Select max(Date) as LatestDate, [User]
from [SOMETABLE]
Group by User
) SubMax
on [SOMETABLE].Date = SubMax.LatestDate
and [SOMETABLE].User = SubMax.User
別の方法として、サブクエリを使用する場合、2回ではなく1回だけテーブルをスキャンします
sQL Server 2005以降のみ
select Date, User, Status, Notes
from (
select m.*, row_number() over (partition by user order by Date desc) as rn
from [SOMETABLE] m
) m2
where m2.rn = 1;
派生テーブルは機能しますが、これがSQL 2005の場合、CTEとROW_NUMBERはよりクリーンになります。
WITH UserStatus (User, Date, Status, Notes, Ord)
as
(
SELECT Date, User, Status, Notes,
ROW_NUMBER() OVER (PARTITION BY User ORDER BY Date DESC)
FROM [SOMETABLE]
)
SELECT User, Date, Status, Notes from UserStatus where Ord = 1
これにより、各ユーザーの最新のxステータスの表示も容易になります。
別の簡単な方法:
SELECT Date, User, Status, Notes
FROM Test_Most_Recent
WHERE Date in ( SELECT MAX(Date) from Test_Most_Recent group by User)