2009-05-04 2 views
1

CreatedDate를 기반으로 SQL 테이블에 삽입 된 최신 레코드를 가져 오려고합니다. 예를 들어, 아래 표에서 세 번째 행을 얻고 싶습니다.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

나는 외부 솔루션을 결합하는 것이 좋아 - 그것은 나에게 발생하지 않았다. 그러나 디스플레이 예상 실행 계획은 내가 보통이 문제를 해결하는 방식보다 더 비싸다는 것을 알았습니다. (내 테이블에 인덱스 관련이있을 수 - 다를 수 있습니다 마일리지)이 하나의 시도를 보내기

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을 드롭하십시오.