2010-07-14 3 views
1

특정 데이터 집합을 검색하기 위해 SQL 문을 알아내는 데 문제가 있습니다. 마지막 업데이트 날짜를 제외한 모든 열이 동일한 경우 가장 최근의 날짜를 원합니다. 예를 들어.
SQL 쿼리 다른 열이 같을 때 최신 행 검색

Book Author Update 
John Foo  1/21/2010 
John Foo  1/22/2010 
Fred Foo2  1/21/2010 
Fred Foo2  1/22/2010 

가장 최근의 행을 검색하는 쿼리는 무엇입니까?

Book Author Update 
John Foo  1/22/2010 
Fred Foo2  1/22/2010 

TIA,
스티브

+2

어떤 맛? 그리고 테이블에있는 것 이외에 다른 컬럼을 비교해야합니까? – harpo

+0

너 락! 모든 해답을 가져 주셔서 감사합니다. Tom H.은 처음으로 대답했습니다. BTW, 당신의 가정은 내가 쿼리에서 더 많은 것을 필요로하는 것이 옳았다. 두 번째 쿼리 주셔서 감사합니다. 그것이 실제로 필요한 것입니다. – ptsw

답변

4
SELECT 
    book, 
    author, 
    MAX(update) 
FROM 
    My_Table 
GROUP BY 
    book, 
    author 

이 유일한 작품이 특별한 경우에 다른 열 모든가 같은 값을 가지고 있기 때문에 : 즉, 반환하는 쿼리입니다. 당신이 책에서 최신 행을 얻을 싶었지만 경우 저자 (또는 검색합니다 다른 열이) 다를 수 있습니다 어디에서 당신은 사용할 수 있습니다

SELECT 
    T.book, 
    T.author, 
    T.update 
FROM 
    (SELECT book, MAX(update) AS max_update FROM My_Table GROUP BY book) SQ 
INNER JOIN My_Table T ON 
    T.book = SQ.book AND 
    T.update = SQ.max_update 
2

DROP TABLE #tmpBooks 
    CREATE TABLE #tmpBooks 
    (
     Book VARCHAR(100), 
     Author VARCHAR(100), 
     Updated DATETIME 
    ) 

    INSERT INTO #tmpBooks VALUES ('Foo', 'Bar', '1/1/1980') 
    INSERT INTO #tmpBooks VALUES ('Foo', 'Bar', '1/1/1990') 
    INSERT INTO #tmpBooks VALUES ('Foo', 'Bar', '1/1/2000') 
    INSERT INTO #tmpBooks VALUES ('Foo', 'Bar', '1/1/2010') 
    INSERT INTO #tmpBooks VALUES ('Foo2', 'Bar2', '1/1/1980') 
    INSERT INTO #tmpBooks VALUES ('Foo2', 'Bar2', '1/1/1990') 
    INSERT INTO #tmpBooks VALUES ('Foo2', 'Bar2', '1/1/2000') 

    SELECT Book, Author, Max(Updated) as MaxUpdated 
     FROM #tmpBooks 
     GROUP BY Book, Author 

을 그것을 고정 결과 :

Book   Author   MaxUpdated 
--------------- --------------- ----------------------- 
Foo    Bar    2010-01-01 00:00:00.000 
Foo2   Bar2   2000-01-01 00:00:00.000 

(2 row(s) affected) 
+0

죄송합니다, bud, 유효한 SQL이 아닙니다. 그것은 그렇게 유혹을 불러 일으켰습니다. * "열 '업데이트'는 집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에 HAVING 절에서 유효하지 않습니다."* – harpo

+0

@harpo, 이제 작동합니다 – CaffGeek

+0

사실 ... 이전 구문 (HAVING Updated = MAX (Updated))는 얻을 수있는 다른 행이있을 때 좋지만, 아쉽게도이를 표현하는 유일한 방법은 더 장황합니다. – harpo

1

이것은 사용자가 요청한 내용을 얻을 수 있지만 원하는 내용이 아니라는 것을 알려줍니다.

SELECT Book, Author, MAX(Update) 
    FROM BookUpdates 
GROUP BY Book, Author 

테이블 스키마가 더 있습니까?

0

은 (에 테스트 할 데이터가없는했지만 작동한다)이 시도 : SQL의

SELECT 
    bu.Book, 
    bu.Author 
FROM 
    BookUpdates bu 
     JOIN 
    (SELECT MAX(Updated) as Date FROM BookUpdates) max 
WHERE 
    bu.Updated = max.Date;