0

最新の日付の連絡先名を取得するクエリを作成しようとしています。連絡先ごとに複数の結果が含まれているテーブルがありますが、日付が異なり、その連絡先の最新の結果を取得しようとしています。

4

4 に答える 4

5

と でランキング関数 ROW_NUMBER()を使用しPARTITION BYますORDER BY Date DESC

WITH CTE
AS
(
   SELECT *,
     ROW_NUMBER() OVER(PARTITION BY contactId
                       ORDER BY date DESC) AS RN
   FROM tablename
)
SELECT *
FROM CTE
WHERE RN = 1;

これにより、各連絡先の最新の日付の行のみが表示されます。

于 2013-08-22T10:41:35.457 に答える
0

以下は、連絡先ごとの最大日付で一時テーブルを作成します。この一時テーブルをベース テーブルに結合すると、探している結果が得られます。

     create table #latestContact (lastdate datetime ,contactid int);
     insert into #latestContact (lastdate, contactid)
     select max(createdate)
     ,contactid 
     from ContactTable
     group by contactid;

     select * 
     from contactTable c
     join #latestContact l
     on l.lastdate = c.createdate
     and l.contactid = c.contactid;

テーブル構造がどのように見えるかはわかりますが、連絡先テーブルには主キー (contacted) があり、作成日時フィールド (createdate) も使用していると思います。

これは、不要な行を選択せず​​、最終的な結果セットから除外するため、上記の cte ランキングの例よりも優れている可能性があります。ただし、どちらのソリューションのクエリ プランや統計も調べていません。これは、何が最適かを確認する良い方法です。

お役に立てれば。

于 2013-08-22T19:27:59.683 に答える
0

また、何か...

select id, contactname from contacts c1
where contactdate = (select max(contactdate) from contacts c2 where c2.id=c1.id)
于 2013-08-22T11:11:15.680 に答える