Выберите наименьшие 2 балла из среднего - PullRequest
1 голос
/ 24 апреля 2019

У меня есть набор результатов с несколькими баллами за элемент.Мне нужно выбрать 2 наименее выигрышных предмета в магазине.Каждый элемент присутствует в образце несколько раз, мне нужно основывать заказ в среднем.Пример:

+------------+--------------+--------+
|   Store    |    Item      | Score  |
+------------+--------------+--------+
| Amsterdam  | Shirt_Black  |      6 |
| Amsterdam  | Shirt_Blue   |      8 |
| Amsterdam  | Shirt_White  |      5 |
| Amsterdam  | Pants_Black  |      3 |
| Amsterdam  | Pants_Black  |      1 |
| Amsterdam  | Socks_Blue   |      8 |
| Amsterdam  | Shirt_Black  |      1 |
| Rotterdam  | Shirt_Blue   |      5 |
| Rotterdam  | Shirt_White  |      3 |
| Rotterdam  | Pants_Black  |      7 |
| Rotterdam  | Socks_White  |      6 |
+------------+--------------+--------+

Должен стать

+------------+-------------+-------+
|   Store    |    Item     | Score |
+------------+-------------+-------+
| Amsterdam  | Pants_Black |     2 |
| Amsterdam  | Shirt_Black |   3.5 | (Average is lower than lowest score)
| Rotterdam  | Shirt_White |     3 |
| Rotterdam  | Shirt_Blue  |     5 |
+------------+-------------+-------+

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

Спасибо!

1 Ответ

2 голосов
/ 24 апреля 2019

Следующий запрос будет работать со средним вычислением:

SELECT Store, Item, CalcAvg AS Score 
FROM (
    SELECT Store, Item, CalcAvg, ROW_NUMBER() OVER (PARTITION BY Store ORDER BY CalcAvg ASC) AS Rn 
    FROM (
        SELECT Store, Item, CAST(AVG(CAST(Score AS DECIMAL(9,2))) AS DECIMAL(9, 2)) AS CalcAvg
        FROM TestTable
        GROUP BY Store, Item
    ) AS Q
)AS R
WHERE R.Rn <= 2;

Демо с примерами данных:

DECLARE @TestTable TABLE (Store VARCHAR (20), Item VARCHAR (20), Score INT);

INSERT INTO @TestTable (Store, Item, Score) VALUES
('Amsterdam', 'Shirt_Black', 6),
('Amsterdam', 'Shirt_Blue',  8),
('Amsterdam', 'Shirt_White', 5),
('Amsterdam', 'Pants_Black', 3),
('Amsterdam', 'Pants_Black', 1),
('Amsterdam', 'Socks_Blue',  8),
('Amsterdam', 'Shirt_Black', 1),
('Rotterdam', 'Shirt_Blue',  5),
('Rotterdam', 'Shirt_White', 3),
('Rotterdam', 'Pants_Black', 7),
('Rotterdam', 'Socks_White', 6);

SELECT Store, Item, CalcAvg AS Score 
FROM (
    SELECT Store, Item, CalcAvg, ROW_NUMBER() OVER (PARTITION BY Store ORDER BY CalcAvg ASC) AS Rn 
    FROM (
        SELECT Store, Item, CAST(AVG(CAST(Score AS DECIMAL(9,2))) AS DECIMAL(9, 2)) AS CalcAvg
        FROM @TestTable
        GROUP BY Store, Item
    ) AS Q
)AS R
WHERE R.Rn <= 2;

Вывод:

Store       Item          Score
--------------------------------
Amsterdam   Pants_Black   2.00
Amsterdam   Shirt_Black   3.50
Rotterdam   Shirt_White   3.00
Rotterdam   Shirt_Blue    5.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...