2014-01-14 5 views
1

У меня есть таблица продуктов и каждая запись имеет цену, которую он был продан в, который может варьироватьсяКак запросить определенную строку из каждой группы

+-------+-----+----+ 
|Product|Price|Date| 
+-------+-----+----+ 
|a  |2 |A | 
+-------+-----+----+ 
|a  |3 |B | 
+-------+-----+----+ 
|a  |4 |C | 
+-------+-----+----+ 
|a  |1 |D | 
+-------+-----+----+ 
|b  |10 |E | 
+-------+-----+----+ 
|b  |15 |F | 
+-------+-----+----+ 
|b  |20 |G | 
+-------+-----+----+ 

Я хочу, чтобы выбрать максимальную цену группы строк с помощью [Product ], как запросить? Результат я хочу:

+-------+-----+----+ 
|Product|Price|Date| 
+-------+-----+----+ 
|a  |4 |C | 
+-------+-----+----+ 
|b  |20 |G | 
+-------+-----+----+ 

Я попытался

SELECT Product, Max(Price) as Price FROM TableName GROUP BY Product 

, но он не получает столбец [Date].

ответ

0

Вы всегда можете использовать CTE, если это на сервере SQL.

WITH CTE AS 
(
SELECT Product, MAX(Price) AS Price 
FROM TableName 
GROUP BY Product 
) 
SELECT CTE.Product, CTE.Price, T.Date 
FROM CTE 
INNER JOIN 
TableName T ON CTE.Product = T.Product AND CTE.Price = T.Price 

Однако могут быть и другие жизнеспособные варианты, которые выполняют лучше, что вам придется проверить себя :) Кроме того, я не принял во внимание, что вы могли бы иметь продукт с той же цене на две записи (Безразлично «т сказать, из описания, что следует считать) ....

+0

Предполагая, что поле цены может быть десятичным или деньгами, это не очень хорошая идея присоединиться к такому полю. –

+0

Спасибо, он работает хорошо и занимает около 2 секунд, чтобы запросить среди 2 миллионов записей в SQL Server 2005. – Nature

+0

Что делать, если я хочу выбрать две верхние записи в каждой группе? – Nature

0
select Product, Price, Date 
from TableName p1 
where p1.Price >= all ( 
    select p2.Price 
    from TableName p2 
    where p2.Product = p1.Product) 
+0

Спасибо, он может работать, но эффективный неприемлем. В таблице 2 миллиона записей, и для запроса требуется около пяти минут. Я использую SQL Server 2005. – Nature

1

Попробуйте this-

SELECT 
    PRODUCT 
    ,PRICE 
    ,DATE 
FROM 
( SELECT 
     PRODUCT 
     ,PRICE 
    , DATE 
     , RANK() OVER (PARTITION BY PRODUCT ORDER BY PRICE DESC) AS RANKED_PRICE 
    FROM TableName 
) RANKED_DATA 
WHERE RANKED_PRICE IN (1,2,3....N) 

то, что мы делаем, ранжирование строки разбиты на разделы продукта и порядок убывания цены. Затем мы выбираем строки, которые имеют ранг 1, чтобы получить нужный результат.

+0

Спасибо, он работает хорошо и занимает около 5 секунд, чтобы запросить среди 2 миллионов записей в SQL Server 2005. – Nature

+1

@Nature - изменил мой ответ выше в ответ на ваш вопрос - если вы хотите выбрать несколько записей - просто продолжайте добавлять ряды , Если ранг существует, записи будут выбраны. Обратите внимание, что выбор нескольких записей, безусловно, немного замедлит его. –

Смежные вопросы