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