Обновить записи, если появились новые данные с момента последнего запуска определенной хранимой процедуры? - PullRequest
0 голосов
/ 17 февраля 2011

Я не уверен, что это практически возможно с SQL (я использую MS SQL 2005), но я пытаюсь создать сводную таблицу транзакций клиентов, которая будет обновляться еженедельно или около того -очень упрощенная версия этого будет выглядеть так:

+-----------------+----------------+----------------+----------------+----------------+
+   Customer_id   + 2007 purchases + 2008 purchases + 2009 purchases + 2010 purchases +
+-----------------+----------------+----------------+----------------+----------------+
+   id_001        +       0        +       7        +       10       +       50       +
+-----------------+----------------+----------------+----------------+----------------+
+   id_002        +       0        +       0        +       5        +       20       +
+-----------------+----------------+----------------+----------------+----------------+
+   id_003        +       100      +       0        +       0        +       0        +
+-----------------+----------------+----------------+----------------+----------------+

В моей таблице около 7 миллионов клиентов, поэтому я не хочу повторять это каждую неделю, если их данные не изменились в течениепрошлая неделя.

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

Я думал о том, чтобы сделать что-то вроде применения этого в качестве фильтра:

WHERE EXISTS (SELECT customer_id 
FROM purchases WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, purchase_date)) > DATEADD(dd, -8, DATEDIFF(dd, 0, getdate()))

Чтобы забрать новые покупки в течение последней недели, но если частота хранимых процедур изменится, это тоже нужно будет изменить, так что, если я смогу фильтровать записи, обновленные только после последнего появления хранимой процедуры, это было бы лучше всего!

Спасибо!

Фактическая структура таблицы - упрощенная

CREATE TABLE
(
id UNIQUEIDENTIFIER
,customer_id NVARCHAR(255)
,date_received DATETIME
,value DECIMAL(18,3)
)

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

1 Ответ

2 голосов
/ 17 февраля 2011

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

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

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