2009-06-26 9 views
45

私は自分のプロジェクトチーム用のステータスボードモジュールを作成しています。ステータスボードを使用すると、ユーザーは自分のステータスをinまたはoutとして設定することができ、メモを提供することもできます。私は、単一のテーブル内のすべての情報を格納する上で計画していた...とデータの例を以下に示します。SQLクエリを作成して最新のレコードを取得する

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のを把握しようとするのですか?どんな助けもありがとう。

+2

ハハハ...宇宙艦隊タイムシート。 –

答えて

63

サブクエリ 派生テーブルで集計してから結合します。

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 
+4

これは派生テーブルと呼ばれます。 – SurroundedByFish

+0

完璧に動作します:-) – Fox

+5

{LatestDate、User}のために派生テーブルが重複して終了するように注意してください。 – alphadogg

41

別の方法で、これはあなたが派生テーブルが働くだろうサブクエリ

のみ、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; 
+0

Magic、3つのテーブルを結合し、このコードに基づいて各タイプの最新のエントリのみを選択するという難しいクエリを解決できました。ありがとうございました! – Sopuli

+1

これは受け入れられた回答と同じ実行計画になりますが、たとえばorgID、Month、Yearのように複数の列でグループ化する必要がある場合、この回答は意味的に洗練されたものです。 – gooddadmike

+0

これは、順序に従って最初に等しいすべてのレコードのレコードをランダムに選択します。 –

7

を使用する場合、一度だけの代わりに、二回表をスキャンしますが、もしますこれは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ステータスの再生。

4

もう一つの簡単な方法:

SELECT Date, User, Status, Notes 
FROM Test_Most_Recent 
WHERE Date in (SELECT MAX(Date) from Test_Most_Recent group by User) 
+3

2人のユーザーが同時にステータスを更新しても、そのクエリは間違っていませんが、その時間はその1つの最新のアクティビティではありませんか? – SooDesuNe

+0

Mahesh、あなたは@ SooDesuNeのコメントを考慮してあなたの答えを更新する必要があります。 –

+0

助けがあれば、WHERE句でSELECTSを使用しないでください。その一度だけあなたがルックアップする必要がない限り。これがストアドプロシージャで実行される場合、結果を返す時間が大幅に増加します。特に大きなテーブルに。 –