2015-03-06 4 views
0

У меня есть таблица, которая выглядит примерно так:Возврат строки с максимальным значением столбца

date  | product | price 
-------------------------------- 
17/01/2015 | milk | 2.54 
18/01/2015 | milk | 2.47 
23/01/2015 | milk | 2.61 
21/01/2015 | eggs | 1.35 
04/02/2015 | eggs | 1.36 
27/01/2015 | eggs | 1.31 

Что мне нужно, это выбрать, что возвращает меня последняя цена каждого продукта, то есть один с максимальная дата. Желаемый результат здесь будет:

23/01/2015 | milk | 2.61 
04/02/2015 | eggs | 1.36 

Я попытался это:

select max(date), product, price FROM table GROUP BY product, price 

, но он не работает, как ожидалось.

+0

Может ли быть несколько записей для одного продукта на ту же дату ? Если да, то как бы вы хотели справиться с этим? Вероятно, вы ищете ['ROW_NUMBER()'] (https://msdn.microsoft.com/en-GB/library/ms186734.aspx) или 'RANK'. –

+0

Нет, всегда будет только одна цена за продукт за одну дату. –

ответ

1

Используйте коррелированный подзапрос, чтобы найти последнюю дату каждого продукта:

select date, product, price 
from table t1 
where date = (select max(date) from table t2 
       where t1.product = t2.product) 

(После прочтения комментария Damien_The_Unbeliever, я хочу добавить, что если несколько записей существуют с тем же максимальной датой для продукта, все они будут возвращены.)

+0

Я использовал это решение, красивое и элегантное. Спасибо :) –

0

Try так:

select max(date), product,price 
from table 
group by product, price 
+1

Это будет жаловаться на то, что цена не была в группе по сумме или сумме –

+0

Я тестировал ее, используя мою собственную таблицу, она работает. – dsharew

+0

Какие dbms? (Некоторые из них немного «гибкие» ...) – jarlh

0

Вы можете сделать это с помощью ROW_NUMBER() в MS SQL.

DECLARE @TABLE TABLE([Date] DATE, Product VARCHAR(40), Price DECIMAL(18,2)) 

INSERT INTO @TABLE VALUES 
('01/17/2015', 'milk', '2.54'), 
('01/18/2015', 'milk', '2.47'), 
('01/23/2015', 'milk', '2.61'), 
('01/21/2015', 'egg', '1.35'), 
('02/04/2015', 'egg', '1.36'), 
('01/27/2015', 'egg', '1.31') 

SELECT * FROM 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY Product ORDER BY [Date] DESC) RN, Product, Price 
    FROM @TABLE 
) Temp 
WHERE RN = 1 
0

попробовать это:

SELECT tb.* 
FROM table tb 
INNER JOIN 
    (SELECT MAX(date), product AS MaxDateTime 
    FROM table 
    GROUP BY product) groupedtb 
ON tb.product = groupedtb.product 
AND tb.date = groupedtb.MaxDateTime 
0

Я знаю, что вы получили ответ уже, но это также работает :)

  DECLARE @TableProducts TABLE (
      [date] DATE, 
      Product VARCHAR(100), 
      Price NUMERIC(9,2) 
      ); 

      INSERT INTO @TableProducts 
      VALUES 
      ('17/01/2015', 'milk', 2.54), 
      ('18/01/2015', 'milk', 2.47), 
      ('23/01/2015', 'milk', 2.61), 
      ('21/01/2015', 'eggs', 1.35), 
      ('04/02/2015', 'eggs', 1.36), 
      ('27/01/2015', 'eggs', 1.31); 


      SELECT B.Product, B.Price, A.MostRecentDate 
      FROM (
        SELECT Product, MAX([date]) AS MostRecentDate 
        FROM @TableProducts 
        GROUP BY Product 
      ) AS A 
      INNER JOIN @TableProducts AS B ON A.Product = B.Product 
              AND A.MostRecentDate = B.[date]; 
Смежные вопросы