我不确定这是否几乎可以用SQL(我正在使用MS SQL 2005),但我要做的是创建一个客户交易的汇总表,每周更新一次 - a非常简化的版本看起来像这样:
+-----------------+----------------+----------------+----------------+----------------+
+ 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 +
+-----------------+----------------+----------------+----------------+----------------+
在我的表格中,我有大约700万客户,所以如果他们的数据在上周内没有变化,我不希望每周重新创建一次。
理想情况下,我想确定自上次运行存储过程以来客户购买数据是否已更改(并且我只对自运行该命名过程后出现新购买的情况感兴趣,因此忽略所有其他的),然后只将更新声明应用于这些客户。
我正在考虑做一些事情,例如将其应用为过滤器:
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)
)
所以我使用了一个数据透视查询来包含上面示例表中每个客户的每年信息(工作正常),并且是更复杂查询的一部分。当应用于所有客户时,查询速度非常慢,因此,如果输出与表中已有的输出不同,我基本上只想在存储过程中运行它!
答案 0 :(得分:2)
为什么不在报告运行时存储日期?这样你的查询就不必改变,你只需要在“今天”和最后一次运行存储过程之间取得差异。
编辑我会在数据库中添加另一个表,您只需在运行报表时存储日期。您可以从请求报告的代码或生成报告的存储过程中简单地填充此表。但是,您可能不需要报告运行的整个历史记录,因此您可能无法存储报告运行时的最后日期(这显然也可以节省数据库中的一些空间)。