我有以下表格
CustomerID FName LName Score Int_Score Contact_Date
----------+------+------+-------+----------+-------------
10 John Doe 20 NULL 2014-01-28
10 John Doe 30 NULL 2014-01-28
10 John Doe 20 NULL 2014-01-28
10 John Doe 40 10 2014-02-10
10 John Doe 20 NULL 2014-02-25
10 John Doe 20 NULL 2014-03-25
10 John Doe 40 10 2014-03-10
10 John Doe 50 25 2014-04-28
10 John Doe 20 NULL 2015-01-25
10 John Doe 50 25 2015-01-28
从这张表中我想计算累积年初日期表中的结果分数。以下是结果分数的计算 -
得分=得分=独特的Int_Score
2014年1月
= 20 + 30 = 50(仅考虑一个20分)
2014年2月
= 40 + 10 = 50(此处已加入20分,因为它已于2014年1月计算)
对于2014年3月,因为在2014年1月已经计入了20分,所以在这里增加了20分。同样,2015年2月已经计入了40,10)
2014年4月
= 50 + 25 = 75
2015年1月(所有分数在新年重置,所有分数值开始计算)
= 20 + 50 + 25 = 95
基于以上所述,我想将结果表格作为
CustomerID Year Month Score
-----------+------+-------+-------
10 2014 1 50
10 2014 2 50
10 2014 3 0
10 2014 4 75
10 2015 1 95
请注意,表格的大小很大,大约有10亿条记录,并且每天都会更新。
答案 0 :(得分:0)
一般方法总是使用GROUP BY
SELECT CustomerID,
DATEPART(Year,Contact_Date),
DATEPART(Month,Contact_Date),
SUM(DISTINCT Score)+COALESCE(Int_Score,0)
GROUP BY CustomerId,
DATEPART(Year, Contact_Date),
DATEPART(Month, Contact_Date)
你无法做任何事情来加速它。如果你必须总结所有十亿行,它将运行几个小时。我建议添加WHERE日期范围,也许customerID IN
。当然,Contact_Date和CustomerID必须是索引字段。如果它是单个索引,则它们必须按GROUP BY的顺序:(CustomerId,Contact_Date)
答案 1 :(得分:0)
试一试。希望它按预期工作。但表现明智我不确定。
SELECT CUSTOMER_ID, CONTRACT_YEAR, CONTRACT_MONTH,
SUM(SCORE+INT_SCORE)
FROM
(SELECT DISTINCT CUSTOMER_ID, YEAR(CONTRACT_DATE) AS CONTRACT_YEAR, MONTH(CONTRACT_DATE) AS CONTRACT_MONTH, SCORE, ISNULL(INT_SCORE,0) AS INT_SCORE
FROM TABLE
WHERE NOT EXISTS (SELECT 1 FROM TABLE B
WHERE B.CUSTOMER_ID = A.CUSTOMER_ID
AND B.SCORE = A.SCORE
AND B.INT_SCORE = A.INT_SCORE
AND B.CONTRACT_DATE < A.CONTRACT_DATE)) AS TABLEA
GROUP BY CUSTOMER_ID, CONTRACT_YEAR, CONTRACT_MONTH