Один столбец даты вместо трех столбцов. Самая быстрая структура для оператора выбора? - PullRequest
0 голосов
/ 14 июля 2020

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

Я работаю над программой, которая импортирует CSV в базу данных, которую я позже проанализировать с помощью pandas. Я получаю один CSV в день со списком проданных в этот день артикулов и статистикой c для каждой артикула. Если у SKU 0 продаж за день, он исключается из CSV. В настоящее время в моей таблице sqlite есть 3 столбца для года, месяца и дня, и каждая строка представляет один SKU.

Пользователь моей программы сможет запрашивать данные о продажах для данного SKU в течение заданного периода времени. .

Инженер-программист посоветовал мне добиться большей производительности, если разделить год, месяц и день на отдельные столбцы. Мысль заключалась в том, что я могу быстро выбрать целые месяцы для заданного периода времени, вместо того, чтобы повторять каждый день.

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

Ниже приведен logi c, который я разработал до сих пор для генерации моего запроса :

-dict1 - это словарь, в котором ключ представляет собой кортеж (гггг, мм), а ключ - это кортеж первого дня выбранного месяца и последнего дня выбранного месяца. напр. {(2020, 02): (15, 29)}

-dict2 - это словарь, в котором ключ представляет собой кортеж (гггг, мм), а ключ - количество дней в месяце.

   For x in dict1
       a = dict1[x]
       if ((a[1] - a[0]) + 1) == dict2[x]:
           query += f"SELECT * FROM skuStats WHERE year = x[0] AND month = x[1] AND sku = {sku}"
       else:
           query += f"SELECT * FROM skuStats WHERE year = x[0] AND month = x[1] AND day BETWEEN a[0] AND a[1] AND sku = {sku}"

       last_item = list(dict1.items())
       if not x == last_item[-1]:
           query += " UNION ALL "

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

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