SQL значение одного столбца на основе максимальных значений в других выбранных строках - PullRequest
0 голосов
/ 05 января 2020

Я использую таблицу базы данных Northwind, и я хотел бы найти верхнюю категорию для каждого поставщика ...

+-----------+----------------------------------+------------+------------+
| ProductID | ProductName                      | SupplierID | CategoryID |
+-----------+----------------------------------+------------+------------+
| 1         | Chai                             | 1          | 1          |
+-----------+----------------------------------+------------+------------+
| 2         | Chang                            | 1          | 1          |
+-----------+----------------------------------+------------+------------+
| 3         | Aniseed Syrup                    | 1          | 2          |
+-----------+----------------------------------+------------+------------+
| 4         | Chef Anton's Cajun Seasoning     | 2          | 2          |
+-----------+----------------------------------+------------+------------+
| 5         | Chef Anton's Gumbo Mix           | 2          | 2          |
+-----------+----------------------------------+------------+------------+
| 6         | Grandma's Boysenberry Spread     | 3          | 2          |
+-----------+----------------------------------+------------+------------+
| 7         | Uncle Bob's Organic Dried Pears  | 3          | 7          |
+-----------+----------------------------------+------------+------------+
| 8         | Northwoods Cranberry Sauce       | 3          | 2          |
+-----------+----------------------------------+------------+------------+
| 9         | Mishi Kobe Niku                  | 4          | 6          |
+-----------+----------------------------------+------------+------------+
| 10        | Ikura                            | 4          | 8          |
+-----------+----------------------------------+------------+------------+
| 11        | Queso Cabrales                   | 5          | 4          |
+-----------+----------------------------------+------------+------------+
| 12        | Queso Manchego La Pastora        | 5          | 4          |
+-----------+----------------------------------+------------+------------+
| 13        | Konbu                            | 6          | 8          |
+-----------+----------------------------------+------------+------------+
| 14        | Tofu                             | 6          | 7          |
+-----------+----------------------------------+------------+------------+
| 15        | Genen Shouyu                     | 6          | 2          |
+-----------+----------------------------------+------------+------------+
| 16        | Pavlova                          | 7          | 3          |
+-----------+----------------------------------+------------+------------+
| 17        | Alice Mutton                     | 7          | 6          |
+-----------+----------------------------------+------------+------------+
| 18        | Carnarvon Tigers                 | 7          | 8          |
+-----------+----------------------------------+------------+------------+
| 19        | Teatime Chocolate Biscuits       | 8          | 3          |
+-----------+----------------------------------+------------+------------+
| 20        | Sir Rodney's Marmalade           | 8          | 3          |
+-----------+----------------------------------+------------+------------+
| 21        | Sir Rodney's Scones              | 8          | 3          |
+-----------+----------------------------------+------------+------------+
| 22        | Gustaf's Knäckebröd              | 9          | 5          |
+-----------+----------------------------------+------------+------------+
| 23        | Tunnbröd                         | 9          | 5          |
+-----------+----------------------------------+------------+------------+
| 24        | Guaraná Fantástica               | 10         | 1          |
+-----------+----------------------------------+------------+------------+
| 25        | NuNuCa Nuß-Nougat-Creme          | 11         | 3          |
+-----------+----------------------------------+------------+------------+
| 26        | Gumbär Gummibärchen              | 11         | 3          |
+-----------+----------------------------------+------------+------------+
| 27        | Schoggi Schokolade               | 11         | 3          |
+-----------+----------------------------------+------------+------------+
| 28        | Rössle Sauerkraut                | 12         | 7          |
+-----------+----------------------------------+------------+------------+
| 29        | Thüringer Rostbratwurst          | 12         | 6          |
+-----------+----------------------------------+------------+------------+
| 30        | Nord-Ost Matjeshering            | 13         | 8          |
+-----------+----------------------------------+------------+------------+
| 31        | Gorgonzola Telino                | 14         | 4          |
+-----------+----------------------------------+------------+------------+
| 32        | Mascarpone Fabioli               | 14         | 4          |
+-----------+----------------------------------+------------+------------+
| 33        | Geitost                          | 15         | 4          |
+-----------+----------------------------------+------------+------------+
| 34        | Sasquatch Ale                    | 16         | 1          |
+-----------+----------------------------------+------------+------------+
| 35        | Steeleye Stout                   | 16         | 1          |
+-----------+----------------------------------+------------+------------+
| 36        | Inlagd Sill                      | 17         | 8          |
+-----------+----------------------------------+------------+------------+
| 37        | Gravad lax                       | 17         | 8          |
+-----------+----------------------------------+------------+------------+
| 38        | Côte de Blaye                    | 18         | 1          |
+-----------+----------------------------------+------------+------------+
| 39        | Chartreuse verte                 | 18         | 1          |
+-----------+----------------------------------+------------+------------+
| 40        | Boston Crab Meat                 | 19         | 8          |
+-----------+----------------------------------+------------+------------+
| 41        | Jack's New England Clam Chowder  | 19         | 8          |
+-----------+----------------------------------+------------+------------+
| 42        | Singaporean Hokkien Fried Mee    | 20         | 5          |
+-----------+----------------------------------+------------+------------+
| 43        | Ipoh Coffee                      | 20         | 1          |
+-----------+----------------------------------+------------+------------+
| 44        | Gula Malacca                     | 20         | 2          |
+-----------+----------------------------------+------------+------------+
| 45        | Rogede sild                      | 21         | 8          |
+-----------+----------------------------------+------------+------------+
| 46        | Spegesild                        | 21         | 8          |
+-----------+----------------------------------+------------+------------+
| 47        | Zaanse koeken                    | 22         | 3          |
+-----------+----------------------------------+------------+------------+
| 48        | Chocolade                        | 22         | 3          |
+-----------+----------------------------------+------------+------------+
| 49        | Maxilaku                         | 23         | 3          |
+-----------+----------------------------------+------------+------------+
| 50        | Valkoinen suklaa                 | 23         | 3          |
+-----------+----------------------------------+------------+------------+
| 51        | Manjimup Dried Apples            | 24         | 7          |
+-----------+----------------------------------+------------+------------+
| 52        | Filo Mix                         | 24         | 5          |
+-----------+----------------------------------+------------+------------+
| 53        | Perth Pasties                    | 24         | 6          |
+-----------+----------------------------------+------------+------------+
| 54        | Tourtière                        | 25         | 6          |
+-----------+----------------------------------+------------+------------+
| 55        | Pâté chinois                     | 25         | 6          |
+-----------+----------------------------------+------------+------------+
| 56        | Gnocchi di nonna Alice           | 26         | 5          |
+-----------+----------------------------------+------------+------------+
| 57        | Ravioli Angelo                   | 26         | 5          |
+-----------+----------------------------------+------------+------------+
| 58        | Escargots de Bourgogne           | 27         | 8          |
+-----------+----------------------------------+------------+------------+
| 59        | Raclette Courdavault             | 28         | 4          |
+-----------+----------------------------------+------------+------------+
| 60        | Camembert Pierrot                | 28         | 4          |
+-----------+----------------------------------+------------+------------+
| 61        | Sirop d'érable                   | 29         | 2          |
+-----------+----------------------------------+------------+------------+
| 62        | Tarte au sucre                   | 29         | 3          |
+-----------+----------------------------------+------------+------------+
| 63        | Vegie-spread                     | 7          | 2          |
+-----------+----------------------------------+------------+------------+
| 64        | Wimmers gute Semmelknödel        | 12         | 5          |
+-----------+----------------------------------+------------+------------+
| 65        | Louisiana Fiery Hot Pepper Sauce | 2          | 2          |
+-----------+----------------------------------+------------+------------+
| 66        | Louisiana Hot Spiced Okra        | 2          | 2          |
+-----------+----------------------------------+------------+------------+
| 67        | Laughing Lumberjack Lager        | 16         | 1          |
+-----------+----------------------------------+------------+------------+
| 68        | Scottish Longbreads              | 8          | 3          |
+-----------+----------------------------------+------------+------------+
| 69        | Gudbrandsdalsost                 | 15         | 4          |
+-----------+----------------------------------+------------+------------+
| 70        | Outback Lager                    | 7          | 1          |
+-----------+----------------------------------+------------+------------+
| 71        | Flotemysost                      | 15         | 4          |
+-----------+----------------------------------+------------+------------+
| 72        | Mozzarella di Giovanni           | 14         | 4          |
+-----------+----------------------------------+------------+------------+
| 73        | Röd Kaviar                       | 17         | 8          |
+-----------+----------------------------------+------------+------------+
| 74        | Longlife Tofu                    | 4          | 7          |
+-----------+----------------------------------+------------+------------+
| 75        | Rhönbräu Klosterbier             | 12         | 1          |
+-----------+----------------------------------+------------+------------+
| 76        | Lakkalikööri                     | 23         | 1          |
+-----------+----------------------------------+------------+------------+
| 77        | Original Frankfurter grüne Soße  | 12         | 2          |
+-----------+----------------------------------+------------+------------+

Используя запрос

SELECT SupplierID, CategoryID, COUNT(CategoryID) AS Total FROM [dbo].[Products] GROUP BY CategoryID, SupplierID

Я получаю Таблица

+------------+------------+-------+
| SupplierID | CategoryID | Total |
+------------+------------+-------+
| 1          | 1          | 2     |
+------------+------------+-------+
| 1          | 2          | 1     |
+------------+------------+-------+
| 2          | 2          | 4     |
+------------+------------+-------+
| 3          | 2          | 2     |
+------------+------------+-------+
| 3          | 7          | 1     |
+------------+------------+-------+
| 4          | 6          | 1     |
+------------+------------+-------+
| 4          | 7          | 1     |
+------------+------------+-------+
| 4          | 8          | 1     |
+------------+------------+-------+
| 5          | 4          | 2     |
+------------+------------+-------+
| 6          | 2          | 1     |
+------------+------------+-------+
| 6          | 7          | 1     |
+------------+------------+-------+
| 6          | 8          | 1     |
+------------+------------+-------+
| 7          | 1          | 1     |
+------------+------------+-------+
| 7          | 2          | 1     |
+------------+------------+-------+
| 7          | 3          | 1     |
+------------+------------+-------+
| 7          | 6          | 1     |
+------------+------------+-------+
| 7          | 8          | 1     |
+------------+------------+-------+
| 8          | 3          | 4     |
+------------+------------+-------+
| 9          | 5          | 2     |
+------------+------------+-------+
| 10         | 1          | 1     |
+------------+------------+-------+
| 11         | 3          | 3     |
+------------+------------+-------+
| 12         | 1          | 1     |
+------------+------------+-------+
| 12         | 2          | 1     |
+------------+------------+-------+
| 12         | 5          | 1     |
+------------+------------+-------+
| 12         | 6          | 1     |
+------------+------------+-------+
| 12         | 7          | 1     |
+------------+------------+-------+
| 13         | 8          | 1     |
+------------+------------+-------+
| 14         | 4          | 3     |
+------------+------------+-------+
| 15         | 4          | 3     |
+------------+------------+-------+
| 16         | 1          | 3     |
+------------+------------+-------+
| 17         | 8          | 3     |
+------------+------------+-------+
| 18         | 1          | 2     |
+------------+------------+-------+
| 19         | 8          | 2     |
+------------+------------+-------+
| 20         | 1          | 1     |
+------------+------------+-------+
| 20         | 2          | 1     |
+------------+------------+-------+
| 20         | 5          | 1     |
+------------+------------+-------+
| 21         | 8          | 2     |
+------------+------------+-------+
| 22         | 3          | 2     |
+------------+------------+-------+
| 23         | 1          | 1     |
+------------+------------+-------+
| 23         | 3          | 2     |
+------------+------------+-------+
| 24         | 5          | 1     |
+------------+------------+-------+
| 24         | 6          | 1     |
+------------+------------+-------+
| 24         | 7          | 1     |
+------------+------------+-------+
| 25         | 6          | 2     |
+------------+------------+-------+
| 26         | 5          | 2     |
+------------+------------+-------+
| 27         | 8          | 1     |
+------------+------------+-------+
| 28         | 4          | 2     |
+------------+------------+-------+
| 29         | 2          | 1     |
+------------+------------+-------+
| 29         | 3          | 1     |
+------------+------------+-------+

Как видите, поставщик 1 производит 2 изделия категории 1 и 1 товар категории 2. Поэтому первая строка в запросе должна выглядеть следующим образом:

+------------+------------+-------+
| SupplierID | CategoryID | Total |
+------------+------------+-------+
| 1          | 1          | 2     |
+------------+------------+-------+

Следующим должен быть идентификатор поставщика № 2, в результате чего получается 4 продукта категории 2. Финальный стол должен выглядеть следующим образом ...

+------------+------------+-------+
| SupplierID | CategoryID | Total |
+------------+------------+-------+
| 1          | 1          | 2     |
+------------+------------+-------+
| 2          | 2          | 4     |
+------------+------------+-------+
| 3          | 2          | 2     |
+------------+------------+-------+
| 4          | 6          | 1     |
+------------+------------+-------+
| 5          | 4          | 2     |
+------------+------------+-------+
| 6          | 2          | 1     |
+------------+------------+-------+
| 7          | 1          | 1     |
+------------+------------+-------+
| 8          | 3          | 4     |
+------------+------------+-------+
| 9          | 5          | 2     |
+------------+------------+-------+
| 11         | 3          | 3     |
+------------+------------+-------+
| 12         | 1          | 1     |
+------------+------------+-------+
| 13         | 8          | 1     |
+------------+------------+-------+
| 14         | 4          | 3     |
+------------+------------+-------+
| 15         | 4          | 3     |
+------------+------------+-------+
| 16         | 1          | 3     |
+------------+------------+-------+
| 17         | 8          | 3     |
+------------+------------+-------+
| 18         | 1          | 2     |
+------------+------------+-------+
| 19         | 8          | 2     |
+------------+------------+-------+
| 20         | 1          | 1     |
+------------+------------+-------+
| 21         | 8          | 2     |
+------------+------------+-------+
| 22         | 3          | 2     |
+------------+------------+-------+
| 23         | 3          | 2     |
+------------+------------+-------+
| 24         | 5          | 1     |
+------------+------------+-------+
| 25         | 6          | 2     |
+------------+------------+-------+
| 26         | 5          | 2     |
+------------+------------+-------+
| 27         | 8          | 1     |
+------------+------------+-------+
| 28         | 4          | 2     |
+------------+------------+-------+
| 29         | 2          | 1     |
+------------+------------+-------+
| 29         | 3          | 1     |
+------------+------------+-------+ 

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

Спасибо

Ответы [ 3 ]

0 голосов
/ 05 января 2020

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

-- Select only the top category counts by supplier
SELECT
    [SupplierID],
    [CategoryID],
    [Total]
FROM (
    -- Rank category counts by supplier
    SELECT
        *,
        RANK() OVER (PARTITION BY [SupplierID] ORDER BY [Total] DESC) AS [Rank]
    FROM (
        -- Generate category counts by supplier
        SELECT
            [SupplierID],
            [CategoryID],
            COUNT(*) AS [Total]
        FROM [Products]
        GROUP BY
            [SupplierID],
            [CategoryID]
    ) AS SupplierCategoryCounts
) AS RankedSupplierCategoryCounts
WHERE [Rank] = 1
ORDER BY [SupplierID]
0 голосов
/ 05 января 2020

На Sql сервере вы можете написать запрос как:

select SupplierID , 
        CategoryID ,
        Total 
from (
select 
        SupplierID , 
        CategoryID ,
        Total ,
        ROW_NUMBER() over (partition by SupplierID order by  Total desc) as rownum
from (
        SELECT SupplierID
            , CategoryID
            , COUNT(CategoryID) AS Total 
        FROM [dbo].[Products]
        GROUP BY CategoryID, SupplierID
        ) as Innertable

) as Outertable
where rownum = 1
order by SupplierID
0 голосов
/ 05 января 2020

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

with cte as (

 select  1 as ProductID, 'Chai'                            as ProductNmae,  1 as SupplierID,  1   as CategoryID   union all                               
 select  2 as ProductID, 'Chang'                           as ProductNmae, 1  as SupplierID, 1    as CategoryID   union all                               
 select  3 as ProductID, 'Aniseed Syrup'                   as ProductNmae, 1  as SupplierID, 2    as CategoryID   union all                               
 select  4 as ProductID, 'Chef Anton''s Cajun Seasoning'   as ProductNmae,  2 as SupplierID,  2   as CategoryID   union all                               
 select  5 as ProductID, 'Chef Anton''s Gumbo Mix'          as ProductNmae, 2  as SupplierID, 2    as CategoryID union all  
 select  6  as ProductID,  'Grandma''s Boysenberry Spread'     as Product_name , 3  as SupplierID,  2  as CategoryID union all         
 select   7 as ProductID,   'Uncle Bob''s Organic Dried Pears' as Product_name ,  3 as SupplierID,  7  as CategoryID union all         
 select   8 as ProductID,   'Northwoods Cranberry Sauce'       as Product_name ,  3 as SupplierID,  2  as CategoryID     )
 select t.SupplierID, t.CategoryID, t.total from ( 
 select supplierID, CategoryID , ROW_NUMBER() over (partition by supplierID order by count(1) desc) rownum, count(1) total    from cte     
 group by supplierID, CategoryID  ) t
 where t.rownum = 1 

Вывод:

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