Вы должны использовать 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
Оригинальный ресурс для этого является главами 28-30 SQL для Присяжных острословов.
(Я рекомендовал эту книгу так я, фигура Celko должна мне роялти к настоящему времени!)
Изменение состоит в том, где Вы используете прямое иерархическое представление (т.е. родительская ссылка в узле), но также и храните значение пути.
т.е. для дерева каталогов, состоящего из следующего:
C:\
Temp
Windows
System32
У Вас были бы следующие узлы
Key Name Parent Path
1 C: *1*
2 Temp 1 *1*2*
3 Windows 1 *1*3*
4 System32 3 *1*3*4*
Путь индексируется и позволит Вам быстро делать запрос, который берет узел и всех его детей, не имея необходимость управлять диапазонами.
т.е. найти C:\Temp и всех его детей:
WHERE Path LIKE '*1*2*%'
Это представление является единственным местом, о котором я могу думать, где хранение идентификатора в строке как это в порядке.