2016-02-05 3 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 окно позволяет вы, ну, станьте рядами рядов динь к некоторому секционирования, а затем вы можете просто выбрать лучших из них:

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 

OUTPUT

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