Получение всей строки из сгруппированного результата

#sql #sql-server #database

#sql #sql-сервер #База данных

Вопрос:

Вот пример таблицы базы данных :

 | ID | ProductID | DateChanged | Price
| 1  | 12        | 2011-11-11  |  93
| 2  | 2         | 2011-11-12  |  12
| 3  | 3         | 2011-11-13  |  25
| 4  | 4         | 2011-11-14  |  17
| 5  | 12        | 2011-11-15  |  97
  

По сути, я хочу получить последнюю цену, сгруппированную по идентификатору продукта.

Результат должен быть таким :

 | ID | ProductID | Price 
| 2  | 2         |  12
| 3  | 3         |  25
| 4  | 4         |  17
| 5  | 12        |  97
  

Если вы заметили, первой строки там нет, потому что есть новая цена для ProductID 12, которая является строкой с идентификатором 5.

В принципе, это должно быть что-то вроде get ID, ProductID и Price, сгруппированных по ProductID, где DateChanged является последним.

Ответ №1:

 SELECT ID, ProductId, Price
FROM
(
   SELECT ID, ProductId, Price
      , ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY DateChanged DESC) AS rowNumber
   FROM yourTable
) AS t
WHERE t.rowNumber = 1
  

Ответ №2:

 SELECT  ID, ProductID,DateChanged, Price
FROM    myTable  
WHERE   ID IN
(
    SELECT  MAX(ID)
    FROM    myTable 
    GROUP BY ProductID
)
  

Ответ №3:

 select a.id, a.productid, a.price
from mytable a,
    (select productid, max(datechanged) as maxdatechanged
    from mytable
    group by productid) as b
where a.productid = b.productid and a.datechanged = b.maxdatechanged
  

Комментарии:

1. Очень просто и понятно. Спасибо за быстрый ответ.

Ответ №4:

 SELECT ID, ProductId, Price 
from myTable A
where DateChanged >= all 
  (select DateChanged
   from myTable B
   where B.ID = A.ID);
  

Комментарии:

1. Я думаю, что мое решение проще и интуитивно понятнее. 🙂 Выберите продукт и цену с наибольшим значением datechanged среди всех его собственных записей.