Intereting Posts
Дата Java – вставка в базу данных Найти все таблицы с полем, содержащим строковые значения xml SQL, чтобы получить количество строк в столбце? Rails, Ransack: как искать отношения HABTM для «всех» совпадений вместо «любых», Удалите несколько выбранных записей из многосетевого списка (Access) Добавлена ​​новая запись TSQL Cursor Присоединитесь к двум таблицам, где таблица A имеет значение даты и должна найти следующую дату в B ниже даты в A sql – вставить, если не существует Исключение: System.InvalidOperationException Попытка проверить регистрационную информацию Могу ли я получить строку SQL из объекта запроса JPA? Неожиданный результат мультимножества в Oracle SQL Являются ли триггеры базы данных безопасными для ограничений целостности таблицы? GROUP BY и COUNT в PostgreSQL Как получить минимальный ключ от функциональных зависимостей? Управление и отладка SQL-запросов в MS Access

SQL с использованием ГДЕ из группы или RANK

У меня есть моментальный снимок продаж с 35 000 строк . Назовем столбцы:

Sales Rep | Account ID | Total Contract Value | Date 

Мне нужно сгруппировать все от Sales Rep а затем оттуда, выбрать 35 лучших счетов Sales Rep основе Total Contract Value если Total Contract Value составляет> = 10 000 долларов США за месяц (дата) января 2013 года .

Так, например, скажем, у Джона Доу было 294 аккаунта в этой таблице с января, я только хочу видеть его лучшие 35 аккаунтов> = 10 000 долларов, то же самое для Джейн Доу и т. Д. И т. Д. Очень важно, чтобы запрос был таким же эффективным в его ресурсе использование по возможности.

Мысли?

Для этого вы хотите использовать функцию row_number() :

 select ss.* from (select ss.*, row_number() over (partition by salesrep order by ContractValue desc) as seqnum from snapshot ss where TotalContractValue >= 10000 and date between '2013-01-01' and '2013-01-31' ) ss where seqnum <= 35 

Вы не указываете используемую вами базу данных. В базах данных, которые не имеют row_number() , существуют альтернативы, которые менее эффективны.

Ответ уже находится в вашем заголовке, раздел SalesRep и AccountID и рейтинг по Total Contact Value .

Решение SQL Server будет выглядеть так:

 DECLARE @minimumValue decimal(20,2) = 10000 DECLARE @numberOfAccounts int = 35 DECLARE @from datetime = '1/1/2013' DECLARE @till datetime = DATEADD(MONTH, 1, @from) SELECT [sub].[Sales Rep], [sub].[Rank], [sub].[Account ID], [sub].[Total Contract Value] FROM ( SELECT [Sales Rep], [Account ID], [Total Contract Value], DENSE_RANK() OVER (PARTITION BY [Sales Rep] ORDER BY [Total Contract Value] DESC) AS [Rank] FROM [Sales] WHERE [Total Contract Value] >= @minimumValue AND [Date] > @from AND [Date] < @till ) AS [sub] WHERE [sub].[Rank] <= @numberOfAccounts ORDER BY [Sales Rep] ASC, [Rank] ASC 

Вот (простой) Sql Fiddle .