79

プロジェクトチームのステータスボードモジュールを作成しています。ステータスボードを使用すると、ユーザーはステータスをインまたはアウトに設定でき、メモを提供することもできます。私はすべての情報を単一のテーブルに保存することを計画していました...そしてデータの例は次のとおりです。

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を理解しようとしていますか?どんな助けでもいただければ幸いです。

4

5 に答える 5

91

サブクエリの派生テーブルに集約してから、それに結合します。

 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 
于 2009-06-26T15:23:01.470 に答える
82

別の方法では、サブクエリを使用する場合、これは2回ではなく1回だけテーブルをスキャンします

SQLServer2005以降のみ

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;
于 2009-06-26T15:41:30.437 に答える
12

派生テーブルは機能しますが、これが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ステータスの表示も容易になります。

于 2009-06-26T18:24:14.143 に答える
6

別の簡単な方法:

SELECT Date, User, Status, Notes  
FROM Test_Most_Recent 
WHERE Date in ( SELECT MAX(Date) from Test_Most_Recent group by User)
于 2012-07-12T07:20:24.370 に答える
0

自動インクリメントの主キーを各レコードに追加します(例:UserStatusId)。

次に、クエリは次のようになります。

select * from UserStatus where UserStatusId in
(
    select max(UserStatusId) from UserStatus group by User
)

日付ユーザーステータスノート

于 2020-12-20T04:21:12.427 に答える