Найдите 80 лучших продуктов в магазине

Мне нужно создать запрос, чтобы найти 80% проданных продуктов в магазине. Есть ли способ сделать это с помощью оконной функции? Моя таблица - это набор данных транзакций со следующими столбцами:

StoreID | ProductID | NoOfProducts | SoldDate

Для одного магазина, если было продано 100 различных продуктов COUNT (DISTINCT (ProductID)) , я ожидал получить набор результатов из 80 продуктов для этого магазина. Как я могу это сделать? (Среда моего БД - SQL Server 2008)

1
nl ja de
Вы попробовали SELECT TOP (80) PERCENT, заказанный COUNT (DISTINCT (ProductID))?
добавлено автор digital.aaron, источник

1 ответы

Что-то вроде этого должно работать с помощью ROW_NUMBER() , а затем с помощью COUNT для каждого хранилища, чтобы определить, какие строки отображать. Это всегда отображает первые 80%, отсортированные по ProductId:

SELECT 
  t.StoreId,
  t.ProductId,
  t.rn
FROM (
    SELECT StoreId, 
         ProductId, 
         ROW_NUMBER() OVER (Partition BY StoreId ORDER BY ProductId) rn
    FROM YourTable ) t JOIN (
    SELECT StoreId,
         COUNT(DISTINCT ProductId) cnt
    FROM YourTable
    GROUP BY StoreId
  ) t2 on t.StoreId = t2.StoreId
WHERE t.rn <= (t2.cnt*.8)

Демо-версия SQL Fiddle

1
добавлено
Это достойный ответ. Я смог использовать NTILE (100), чтобы разделить ProductID и отфильтровать его так же. Благодаря!
добавлено автор codedawg82, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)