Вот как я это делаю. Я добавил объяснение, чтобы понять, что происходит.
Инициализировать локальный репозиторий
Еще один вариант - использовать WITH TIES
совместно с Row_Number()
Полное раскрытие: Ответ Вамси будет подталкивать к повышению производительности.
Пример
Select Top 1 with ties *
From YourTable
Order by Row_Number() over (Partition By ProductID Order by LastUpdate Desc)
Возвращает
ProductID Quantity LastUpdate
1 444 2019-01-02
2 222 2019-01-02
Функция row_number () может быть наиболее эффективной, но большое замедление в вашем запросе заключается в использовании оператора IN при использовании в подзапросе, он немного сложнее, но объединение происходит быстрее. Этот запрос должен получить то, что вы хотите, и быть намного быстрее.
SELECT
a.ProductID
,a.Quantity
FROM stock as a
INNER JOIN (
SELECT
ProductID
,MAX(LastUpdate) as LastUpdate
FROM stock
GROUP BY ProductID
) b
ON a.ProductID = b.ProductId AND
a.LastUpdate = b.LastUpdate
Используйте аналитические функции. row_number
можно использовать в этом случае.
SELECT ProductID, Quantity
FROM (SELECT ProductID, Quantity, row_number() over(partition by ProductID order by LstUpdte desc) as rnum
FROM Stock
) s
WHERE RNUM = 1
Или с first_value
.
SELECT DISTINCT ProductID, FIRST_VALUE(Quantity) OVER(partition by ProductID order by LstUpdte desc) as quantuity
FROM Stock