2009-05-04 4 views
1

私は、CreatedDateに基づいてSQLテーブルに挿入された最新のレコードを取得しようとしています。たとえば、次の表では、3行目を取得したいと考えています。CreatedDateフィールドの助けを借りて挿入された最新の行を取得

A B C 2009-05-04 19:30:52.847 
A B D 2009-05-04 19:30:55.050 
A B E 2009-05-04 19:30:57.003 

私は動作するクエリがありますが、同じ結果を得るためのよりよい方法があるかどうかは疑問です。以下は私のテストで今使用しているテーブル、データ、およびクエリです。これを行うための良い方法はありますか?

CREATE TABLE TestTable (
    ColumnA  NVARCHAR(10), 
    ColumnB  NVARCHAR(10), 
    ColumnC  NVARCHAR(10), 
    CreatedDate DATETIME DEFAULT Getutcdate()) 

INSERT INTO TestTable(ColumnA, ColumnB, ColumnC) VALUES ('A', 'B', 'C'); 
INSERT INTO TestTable(ColumnA, ColumnB, ColumnC) VALUES ('A', 'B', 'D'); 
INSERT INTO TestTable(ColumnA, ColumnB, ColumnC) VALUES ('A', 'B', 'E'); 

SELECT * 
FROM TestTable 
WHERE CreatedDate = (SELECT Max(CreatedDate) 
         FROM  TestTable 
         WHERE ColumnA = 'A' 
           AND ColumnB = 'B' 
         GROUP BY ColumnA, 
           ColumnB) 

ありがとうございます!

答えて

2

あなたもこの猫を肌には、さまざまな方法があります

SELECT top 1 * 
FROM TestTable 
order by CreatedDate desc 
0

を書くことができます。いくつかのことはまだ投稿されていません。

SELECT 
    T1.column_a, 
    T1.column_b, 
    T1.column_c, 
    T1.created_date 
FROM 
    dbo.Test_Table T1 
WHERE 
    T1.column_a = 'A' AND 
    T1.column_b = 'B' AND 
    NOT EXISTS 
    (
      SELECT 
       * 
      FROM 
       dbo.Test_Table T2 
      WHERE 
       T2.column_a = T1.column_a AND 
       T2.column_b = T1.column_b AND 
       T2.created_date > T1.created_date 
    ) 

または

SELECT 
    T1.column_a, 
    T1.column_b, 
    T1.column_c, 
    T1.created_date 
FROM 
    dbo.Test_Table T1 
LEFT OUTER JOIN dbo.Test_Table T2 ON 
    T2.column_a = T1.column_a AND 
    T2.column_b = T1.column_b AND 
    T2.created_date > T1.created_date 
WHERE 
    T1.column_a = 'A' AND 
    T1.column_b = 'B' AND 
    T2.column_a IS NULL 
1

を私は外側がソリューションに参加することを好む - それは私には発生していませんでした。しかし推定実行計画を表示は、私が通常この問題を解決する方法よりも高価であることがわかりました。 (私のテーブルの上にインデックスに関連している可能性が - あなたの走行距離は異なる場合があります)この1を試してみる:

SELECT 
    T1.ColumnA, 
    T1.ColumnB, 
    T1.ColumnC, 
    T1.CreatedDate 
FROM 
    dbo.TestTable T1 
    JOIN (SELECT ColumnA, 
       ColumnB, 
       max(CreatedDate) MaxDate 
      FROM 
       dbo.TestTable 
      GROUP BY ColumnA, 
        ColumnB) T2 
    ON T1.ColumnA  = T2.ColumnA 
    AND T1.ColumnB  = T2.ColumnB 
    AND T1.CreatedDate = T2.MaxDate 
0
SELECT TOP 1 WITH TIES * 
FROM TestTable 
WHERE ColumnA = 'A' 
    AND ColumnB = 'B' 
ORDER BY CreatedDate DESC 

をこれが重複してCreatedDateによるものであり、あなたがそれらのすべてを必要とする場合だけです。

それ以外の場合は、WITH TIESをドロップしてください。

関連する問題