对于我在工作的业务,我想获得有关客户的信息。我对这些客户的基本信息如下:
Activation_Date
存储在Loans
表中,数据类型为datetime
。ActivityDate
存储在CustomerDailyLoanActivity_Information
表格中(每日贷款表格给感兴趣的人,它是数据集市的一部分,并存储每个日客户一直处于活动状态我们公司已经为他们的贷款支付了多少钱,所以如果客户的Activation_Date
为15-03-2017,那么它在ActivityDate
表格中的CustomerDailyLoanActivity_Information
位于15-03 -2017到目前为止,每个ActivityDate
在另一列Sum_Paid_To_Date
中都有记录ActivityDate
之前支付了多少费用。{ ActivityDate
的数据类型为date
。我想知道的是以下内容,我想知道每个客户在Activation_Date
之后的1个月,2个月,3个月等多少付款。所以查询看起来像下面这样(稍微伪代码,更重要的部分是WHERE
子句)。
SELECT
cldai.Sum_Paid_To_Date,
cldai.ActivityDate,
cldai.Customer_Account_Number
FROM
CustomerLoanDailyActivity_Information cldai
INNER JOIN
Loans l ON l.Customer_Account_Number = cldai.Customer_Account_Number
WHERE
(cldai.ActivityDate = CAST(l.Activation_Date AS date)
OR
cldai.ActivityDate = DATEADD(month, 1, CAST(l.Activation_Date AS date))
OR
cldai.ActivityDate = DATEADD(month, 2, CAST(l.Activation_Date AS date))
OR
cldai.ActivityDate = DATEADD(month, 3, CAST(l.Activation_Date AS date))
)
ORDER BY
l.Customer_Account_Number, cldai.ActivityDate ASC
所以问题是这个查询真的很慢(因为WHERE子句,因为cldai
表很大(~6 GB))并且在检索任何数据之前退出。我听过的几个问题,以及可能的解决方案,但到目前为止还没有奏效。
ActivityDate
列进行了比较。之前我使用过CONVERT,但这也很慢。我觉得我需要进行转换/转换,因为ActivityDate
属于date
类型且Activation_Date
属于datetime
类型,因此有可能datetime
中Activation_Date
的时间部分将导致与ActivityDate
没有匹配(例如Activation_Date
对于给定的客户是15-03-2017 09:00 :00因此它永远不会与ActivityDate
15-03-2017匹配,因为这可能会转换为datetime
15-03-2017 00:00:00,由于{{time
永远不会相等1}}部分)。有关如何使此查询执行速度更快的任何想法?任何帮助将不胜感激。
答案 0 :(得分:1)
因此,通过使用LEFT JOIN
而不是INNER JOIN
并且不在服务器上但在客户端订购数据来获得大量加速。这将查询时间从大约1小时10分钟缩短到大约1分钟。这似乎令人难以置信,但事情就是这样。
此致
添
答案 1 :(得分:0)
如果您保证每天都有记录,您可以申请使用row_number()函数为每组客户贷款还款记录应用行号,然后检索行1,31,61和91?这样可以避免任何日期操作。
答案 2 :(得分:0)
如何将其分为两个步骤?第一步 - 为每个客户建立一个包含四个日期的表格。然后在第二步,将其与日期和客户帐号的主CustomerLoanDailyActivity_Information表相关联。第二步将有一个更简单的连接,只是在您构建的表中的ActivityDate和日期条目之间的一个=。