У меня есть таблица, содержащая даты, столбец, содержащий несколько названий книг, и, наконец, столбец, содержащий количество продаж по каждому названию. В любой день продаются от 1 до 10 наименований. Возможно, «Название 1» 10 штук, «Название 3» 5 штук и «Название 4» 15 штук. В другой день, возможно, будут продажи только для Title 2, 7 и т. д.
Теперь, сосредоточив внимание на тех днях, когда было продано более 1 названия, я могу выбрать дату, название и объем продаж с помощью [ORDER BY] объема продаж, и действительно результатом является таблица, в которой указаны предполагаемые максимальные продажи за день через пункт заказа. Но что, если мне также нужен индекс для каждого заголовка, чтобы, например, я мог видеть день за днем положение, скажем, заголовка 3? Можно ли добавить в результат запроса такой простой индекс?
Итак, я надеюсь получить результат запроса, как показано ниже:
и т. д.
Я использую MS ACCESS с VB.NET и изо всех сил пытаюсь найти способ. Спасибо
Вы можете использовать подзапрос для расчета количества наименований, продажи которых превышают текущую строку. Это позволит получить ранг строки (индекс), который вы ищете.
Если у двух наименований одинаковый объем продаж, они получат одинаковый индекс. При необходимости можно дополнительно ранжировать, например, по имени.
См. пример
SELECT t1.*,
(select count(*) from DateTitleIndexSales as t2
where t2.SalesDate=t1.SalesDate
and (t2.sales>t1.sales or (t2.sales=t1.sales and t2.title<t1.title))
)+1 as index
FROM DateTitleIndexSales as t1
order by SalesDate, Sales desc,Title ;
Отличное руководство, спасибо. К сожалению, ROW_NUMBER() не работает в MS ACCESS (почему я не удивлен). Но проверяя, есть ли способ обойти это ограничение, я обнаружил более старую ветку Stack Overflow, которая посвящена именно этой проблеме: Достижение ROW_NUMBER/PARTITION BY в MS Access.
Возможно, ваш комментарий относится к другому ответу на ваш вопрос. row_number()
нет в Access, и в своем ответе я предлагаю заменить эту функцию подзапросом.
Я думаю, ты имел в виду t2.title<>t1.title
Нет, я думаю, t2.title<t1.title. Нужна определенность порядка. Если мы возьмем ('Title 1',100) и ('Title 2',100), нам нужно определить порядок между ними. Я произвольно беру этот заголовок перед заголовком 2. Или как row_number()over(partition by SalesDate order by sales desc,title asc)
И если мы удалим условие or (t2.sales=t1.sales and t2.title<t1.title)
row_number() превратится в Rank().
@ValNik - Да, я думаю, что это была ошибка, поскольку мне было очень любопытно решение, я, должно быть, прочитал ваш ответ, и Мит Шах подумал, что они оба были от вас. Что касается вашего решения, я попробовал его, но как ни странно, машина продолжает выполнять вычисления (без ошибок) в течение нескольких минут... это правда, что я использовал ваш запрос к таблице, которая является результатом другого запроса, а не сохраненной таблицы. Возможно, в этом проблема. Я попробую сначала сохранить данные в таблицу.
Трудно что-либо сказать, не видя полного запроса или последовательности запросов. Однако индекс SalesDate в исходной таблице был бы очень полезен. Насколько велики исходные данные?
Насколько я понял, вам нужен порядок индексирования по дате по продаже конкретного названия книги,
Для этого вы можете использовать оконную функцию row_number().
SELECT Date, Title, Sales, ROW_NUMBER() OVER(PARTITION BY Date ORDER BY Sales DESC) as index from {tableName}
Не в MS Access, он не поддерживается.
Используйте мою функцию RowNumber.