2016-02-05 108 views
3

我有如下表:
取得每個組的最新記錄通過SQL

----------------------------------------------------------- 
ID  oDate   oName  oItem oQty oRemarks 
----------------------------------------------------------- 
1  2016-01-01 A   001  2  
2  2016-01-01 A   002  1  test 
3  2016-01-01 B   001  3 
4  2016-01-02 B   001  2 
5  2016-01-02 C   001  2 
6  2016-01-03 B   002  1 
7  2016-01-03 B   001  4 
     ff. 

我想每一個名字的最新記錄。所以結果應該是這樣的:

----------------------------------------------------------- 
oDate   oName  oItem oQty oRemarks 
----------------------------------------------------------- 
2016-01-01 A   001  2  
2016-01-01 A   002  1  test 
2016-01-02 C   001  2 
2016-01-03 B   002  1 
2016-01-03 B   001  4 
ff. 

有誰知道怎麼辦得到這樣的結果?
謝謝。

+1

結果不是 「爲每個名字的新唱片」 因爲有重名。 –

+0

@Haminteu添加主鍵好友它會解決你的問題,你可以按順序排列。 – androidGenX

+0

@androidGenX,嗨。只需編輯表格。我的桌子上有身份專欄。乾杯。 – Haminteu

回答

3

rank窗口子句允許你好,排行accor鼎一些分區,然後你可以只選擇頂部的:

SELECT oDate, oName, oItem, oQty, oRemarks 
FORM (SELECT oDate, oName, oItem, oQty, oRemarks, 
       RANK() OVER (PARTITION BY oName ORDER BY oDate DESC) AS rk 
     FROM my_table) t 
WHERE rk = 1 
2

我認爲你需要這樣的查詢:

SELECT * 
FROM (SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY oName ORDER BY oDate DESC) seq 
    FROM yourTable) t 
WHERE (seq <= 2) 
ORDER BY oDate; 
0

你有以下使用ROW_NUMBER

select oDate, oName, oItem, oQty, oRemarks 
from (
    select *, row_number() over(partition by oName, oItem order by oDate desc) rn 
    from #t 
)x 
where rn = 1 
order by oDate 

輸出

oDate oName oItem oQty oRemarks  
2016-01-01 A 001  2     
2016-01-01 A 002  1  test   
2016-01-02 C 001  2     
2016-01-03 B 001  4     
2016-01-03 B 002  1     
2

一個primary key假設id字段添加到表中,並使其自動遞增,。然後通過id訂購你會得到它。這是傳統的方式。通過使用您的表格,您只能通過oDate進行訂購。但是有多次相同的日期,所以它也不會解決你的問題。

3

這是一個不使用分析函數的通用查詢。

SQLFiddle Demo

SELECT a.* 
FROM table1 a 
INNER JOIN 
    (SELECT max(odate) modate, 
      oname, 
      oItem 
    FROM table1 
    GROUP BY oName, 
      oItem 
    ) 
    b ON a.oname=b.oname 
AND a.oitem=b.oitem 
AND a.odate=b.modate