Запрос доступа: найдите продукт высшего ранга в каждой категории - PullRequest
0 голосов
/ 29 марта 2011

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

qryEvalProd    
category Product   Rank
-------- -------   ----
Cat1     Prod6     1254
Cat1     Prod1      950
Cat1     Prod2      800
Cat2     Prod3     1500
Cat2     Prod5      950

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

category Product   
-------- -------   
Cat1     Prod6     
Cat2     Prod3    

Я знаю, что мог бы сделать это, используя коррелированный подзапрос, содержащий группу по Максу и Максу, но по соображениям производительности я пытаюсь сделать это за один раз, используя Группу По и Первый. Но я не могу выразить тот факт, что я хочу, чтобы первый продукт каждой кошки был отсортирован по DESC Rank

Есть ли способ сделать это за один проход?

Ответы [ 4 ]

1 голос
/ 31 марта 2011

Этот твик позволяет вам добавить ЗАКАЗ, который вы хотели.Он использует подзапрос ... но не коррелированный подзапрос, поэтому производительность не ухудшается:

SELECT Category, First(Product) AS BestProduct
FROM (
  SELECT Category, Product, Rank
  FROM qryEvalProd
  ORDER BY Category, Rank DESC
) AS Ordered
GROUP BY Category;
0 голосов
/ 29 марта 2011

На самом деле это, кажется, работает. Я просто немного раздражен, потому что я не могу навязать в своем утверждении порядок набора входных данных, но, в любом случае, он ошибается.

SELECT Category, First(Product) AS BestProduct
FROM qryEvalProd    
GROUP BY Category;

Я могу добавить ORDER BY Category без какого-либо влияния на вывод. Я хотел бы добавить ORDER BY Category, Rank, чтобы быть уверенным, но это не принято.

Если у кого-то есть лучшее предложение, вы все равно можете его приветствовать.

0 голосов
/ 29 марта 2011

Вы могли бы начать с чего-то вроде этого:

SELECT Category, Product
FROM qryEvalProd
WHERE Product = 
    (SELECT TOP 1 Self.Product 
    FROM qryEvalProd AS Self
    WHERE Self.Category = qryEvalProd.Category
    ORDER BY Self.Rank DESC)

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

Если вы хотите, чтобы он всегда выбирал один и тот же, вы, вероятно, можете заставить его делать то, что вы хотите, изменив предложение ORDER BY.Например, если в случае связывания вы хотите, чтобы он выбрал тот, который имеет первое значение «Продукт» в алфавитном порядке, вы можете изменить предложение ORDER BY на:

ORDER BY Self.Rank DESC, Self.Product

Если вы хотите вместо этогочтобы перечислить все продукты с наивысшим рейтингом, вы можете использовать такой запрос:

SELECT Category, Product
FROM qryEvalProd
WHERE Rank = 
    (SELECT Max(Self.Rank) 
    FROM qryEvalProd AS Self
    WHERE Self.Category = qryEvalProd.Category)
0 голосов
/ 29 марта 2011

Возможно, может помочь использование HAVING ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...