2015-12-09 22 views
0

DB選擇最新的記錄:mysql的如何從表

我有以下記錄表(tblSomething):

enter image description here

現在我需要通過選擇最新的過濾這個記錄來自此表的唯一記錄。

的結果應該是:

enter image description here

在第二圖象的喬和麗娜與2015年11月16日不可用。

你能告訴我如何編寫一個查詢來實現這一點。

+0

MySQL或SQL服務器?不能兼得。 – DarkKnight

+0

@DarkKnight事實上,如果我們給出一個純粹的ANSI-92查詢作爲答案,它就可以同時存在。但是,他應該適當地標註。 –

+0

爲什麼記錄'404 468 joe tina'在結果集中出現兩次? 「11/16/2015」記錄是否應該不被查詢過濾掉? –

回答

2

嘗試以下查詢:

SELECT t1.ID1, t1.ID2, t1.Name1, t1.Name2, t1.date 
FROM tblSomething t1 
INNER JOIN 
(
    SELECT ID1, ID2, MAX(date) AS date 
    FROM tblSomething 
    GROUP BY ID1, ID2 
) t2 
ON t1.ID1 = t2.ID1 AND t1.ID2 = t2.ID2 AND t1.date = t2.date 

內查詢確定,對於每個ID1/ID2對,最近的日期。然後在整個tlbSomething表上的查詢受到限制,只保留那些具有對於每個ID1/ID2對最近日期的記錄。

點擊下面的鏈接,查看使用OP的樣本數據進行的演示。

SQLFiddle

+0

加上一個簡單的解決方案和解釋。 – DarkKnight

+0

不錯的解決方案,如果它有更多的領域,你將如何處理這個問題,看到更新的問題。 – yogeshkmrsoni

+0

@yogeshkmrsoni嘗試一下小提琴。輸出與您在OP中向我們展示的內容相符。 –

0

使用MAXstr_to_date

SELECT * 
FROM table t1 
WHERE str_to_date(t1.date,'%m/%d/%Y')=(SELECT MAX(str_to_date(t2.date,'%m/%d/%Y')) 
       FROM table t2 
       WHERE t1.ID2 = t2.ID2) 
0
CREATE TABLE #tblSomething 
(ID1 int, ID2 int, Name1 varchar(55), Name2 varchar(55), date1 date, cost int, days int, somefield int); 

INSERT INTO #tblSomething 
    (ID1, ID2, Name1, Name2, date1, cost, days, somefield) 
VALUES 
    (330, 435, 'sn1', 'hello1', '2015-11-17', 500, 12, 34), 
    (404, 467, 'joe', 'rina', '2015-11-23', 600, 23, 22), 
    (404, 467, 'joe', 'rina', '2015-11-16', 700, 11, 123), 
    (404, 468, 'joe', 'tina', '2015-11-23', 800, 23, 41), 
    (404, 468, 'joe', 'tina', '2015-11-16', 789, 11, 43); 

試試這個

with res as (select *,ROW_NUMBER() over(partition by ID1, ID2, Name1, Name2 order by ID1, ID2, Name1, Name2) as rn from #tblSomething) 
    select ID1, ID2, Name1, Name2, date1, cost, days, somefield from res where rn=1 

輸出

enter image description here