Nano Hash - криптовалюты, майнинг, программирование

SQL Multiple Join/Sums для таблицы Product

У меня есть следующая таблица, содержащая данные о продажах продуктов из группы сетевых магазинов. Данные большие и некрасивые, но только так я могу получить их из магазинов. Для информации, в настоящее время таблица содержит 22 миллиона записей, число которых увеличивается примерно на 300 тысяч в день, и этот темп роста будет экспоненциально увеличиваться примерно на 100% ежемесячно.

Store_Purchases(
[ID] [int] IDENTITY(1,1) NOT NULL,
[storecode] [int] NULL,
[dtDatum] [datetime] NULL,
[Barcode] [varchar](50) NULL,
[Desc] [varchar](100) NULL,
[qty] [int] NULL,
[amount] [money] NULL,
[TillslipID] [int] NULL)

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

Пока мне удалось придумать следующее. Выполнение этого запроса на моем сервере занимает 2 минуты 20 секунд, и я думаю, что значение «Сумма корзины» неверно. Я хотел бы знать, есть ли лучший способ сделать это в одном запросе или даже в хранимой процедуре.

SELECT
  a.Barcode, 
  a.Desc, 
  SUM(b.amount) 'Basket SUM',
  COUNT(distinct b.TillslipID) 'Basket Count', 
  Sales.Count, 
  Sales.Amount 
FROM Store_Purchases b WITH (NOLOCK), 
Store_Purchases a WITH (NOLOCK), 
(
  SELECT
    top 500 Barcode,
    sum(qty) "Count", 
    SUM(amount) "Amount" 
  FROM Store_Purchases WITH (NOLOCK)
  WHERE (storecode = 30143)
  AND dtDatum BETWEEN '1-Feb-2013 00:00:00' AND '28-Feb-2013 23:59:59'
  GROUP BY Barcode
  ORDER BY SUM(amount) DESC
) AS Sales
WHERE (a.storecode = 30143)
AND a.dtDatum BETWEEN '1-Feb-2013 00:00:00' AND '28-Feb-2013 23:59:59'
AND a.Barcode = Sales.Barcode 
AND a.TillslipID = b.TillslipID 
AND a.storecode = b.storecode
AND b.dtDatum BETWEEN '1-Feb-2013 00:00:00' AND '28-Feb-2013 23:59:59'
GROUP BY a.Barcode, a.Desc, Sales.Count, Sales.Amount
ORDER BYSales.Count DESC

Любая помощь будет оценена по достоинству. Спасибо.

04.03.2013

  • Различие в поле TillslipID добавляет 2 минуты к времени выполнения запроса, но я не мог придумать другого способа сделать это. 04.03.2013

Ответы:


1
select top 500 Barcode, [Desc], sum([Count]) as [Count], sum([Amount]) as Amount, sum(BasketSum) as [Basket Sum], count(TillslipID) as [Basket Count]
from (
    select Barcode, [Desc], TillslipID, [Count], [Amount], sum(Amount) over (partition by TillSlipID) as BasketSum
    from (
        select TillslipID, Barcode, [Desc], sum(qty) as [Count], sum(amount) as [Amount]
        FROM ez_Sparbuck_Products p
        WHERE (storecode = 30143) and dtDatum between '1-Feb-2013 00:00:00' and '28-Feb-2013 23:59:59'
        group by Barcode, [Desc], TillslipID, 
    ) t
) t
group by Barcode, [Desc]

Это делает предположение, что штрих-код не имеет двух [Desc], что, учитывая результат, которого вы пытаетесь достичь, кажется, имеет место. Если это не так, этот же запрос можно изменить, чтобы использовать partition by Barcode и distinct.

Для объемов данных, с которыми вы это делаете, я думаю, вам понадобится кластеризованный индекс на dtDatum и, возможно, какое-то разделение на storecode.

04.03.2013
  • Спасибо, это очень близко. Мне пришлось добавить WHERE (storecode = 30143) и dtDatum между «1 февраля 2013 г. 00:00:00» и «28 февраля 2013 г. 23:59:59» во внутреннюю часть соединения, и теперь он вытягивает 500 строк. за 1 сек. Единственная проблема заключается в том, что поле «Сумма корзины» не вводит правильное значение. Хотя это близко. 04.03.2013
  • При второй проверке счетчик корзин также не работает. Пожалуйста, обратите внимание, что может быть более одной записи для одного и того же продукта с одним и тем же TillSlipID. 04.03.2013
  • ОК, посмотрите обновленный ответ для счетчика корзин, он лучше? Можете ли вы дать точное определение Basket SUM? Я прочитал это как сумму суммы для всех корзин, содержащих этот штрих-код. 04.03.2013
  • Спасибо. Вы правильно прочитали, но, например, запрос выдает 1043 корзины с продуктом А, но на самом деле существует только 1007 уникальных корзин с этим продуктом. Я думаю, что это же дублирование может быть связано и с полем «Сумма корзины». Каждая корзина, содержащая товар, должна быть добавлена ​​к сумме корзины только один раз. Надеюсь, это поможет. 04.03.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

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