Добавление индекса к результату запроса

У меня есть таблица, содержащая даты, столбец, содержащий несколько названий книг, и, наконец, столбец, содержащий количество продаж по каждому названию. В любой день продаются от 1 до 10 наименований. Возможно, «Название 1» 10 штук, «Название 3» 5 штук и «Название 4» 15 штук. В другой день, возможно, будут продажи только для Title 2, 7 и т. д.

Теперь, сосредоточив внимание на тех днях, когда было продано более 1 названия, я могу выбрать дату, название и объем продаж с помощью [ORDER BY] объема продаж, и действительно результатом является таблица, в которой указаны предполагаемые максимальные продажи за день через пункт заказа. Но что, если мне также нужен индекс для каждого заголовка, чтобы, например, я мог видеть день за днем ​​положение, скажем, заголовка 3? Можно ли добавить в результат запроса такой простой индекс?

Итак, я надеюсь получить результат запроса, как показано ниже:

Дата Заголовок Индекс Продажи 15 августа 2024 г. Название 2 1 125 15 августа 2024 г. Название 4 2 100 15 августа 2024 г. Название 5 3 90 15 августа 2024 г. Название 9 4 50 16 августа 2024 г. Название 1 1 230 16 августа 2024 г. Название 2 2 150 16 августа 2024 г. Название 7 3 100 17 августа 2024 г. Название 4 1 50 17 августа 2024 г. Название 9 2 20

и т. д.

Я использую MS ACCESS с VB.NET и изо всех сил пытаюсь найти способ. Спасибо

Используйте мою функцию RowNumber.

Gustav 02.09.2024 12:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать подзапрос для расчета количества наименований, продажи которых превышают текущую строку. Это позволит получить ранг строки (индекс), который вы ищете.

Если у двух наименований одинаковый объем продаж, они получат одинаковый индекс. При необходимости можно дополнительно ранжировать, например, по имени.

См. пример

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.

Stefan Liiceanu 02.09.2024 11:46

Возможно, ваш комментарий относится к другому ответу на ваш вопрос. row_number() нет в Access, и в своем ответе я предлагаю заменить эту функцию подзапросом.

ValNik 02.09.2024 11:53

Я думаю, ты имел в виду t2.title<>t1.title

Efraim Newman 02.09.2024 21:10

Нет, я думаю, t2.title<t1.title. Нужна определенность порядка. Если мы возьмем ('Title 1',100) и ('Title 2',100), нам нужно определить порядок между ними. Я произвольно беру этот заголовок перед заголовком 2. Или как row_number()over(partition by SalesDate order by sales desc,title asc)

ValNik 02.09.2024 21:17

И если мы удалим условие or (t2.sales=t1.sales and t2.title<t1.title) row_number() превратится в Rank().

ValNik 02.09.2024 21:23

@ValNik - Да, я думаю, что это была ошибка, поскольку мне было очень любопытно решение, я, должно быть, прочитал ваш ответ, и Мит Шах подумал, что они оба были от вас. Что касается вашего решения, я попробовал его, но как ни странно, машина продолжает выполнять вычисления (без ошибок) в течение нескольких минут... это правда, что я использовал ваш запрос к таблице, которая является результатом другого запроса, а не сохраненной таблицы. Возможно, в этом проблема. Я попробую сначала сохранить данные в таблицу.

Stefan Liiceanu 02.09.2024 21:58

Трудно что-либо сказать, не видя полного запроса или последовательности запросов. Однако индекс SalesDate в исходной таблице был бы очень полезен. Насколько велики исходные данные?

ValNik 02.09.2024 22:08
Ответ принят как подходящий

Насколько я понял, вам нужен порядок индексирования по дате по продаже конкретного названия книги,

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

SELECT Date, Title, Sales, ROW_NUMBER() OVER(PARTITION BY Date ORDER BY Sales DESC) as index from {tableName}

Не в MS Access, он не поддерживается.

Kostas K. 02.09.2024 11:01

Другие вопросы по теме