使用其他表中的数据填充表的最快方法

时间:2016-09-22 13:12:40

标签: sql tsql functional-programming

我已经阅读了功能性编程背后的概念,这让我重新考虑我的做事方式。

例如,有一个表:

 - Client, Date, Trial, Full
 - Client1, 14.11.2012, 1, 1
 - Client1, 06.02.2013, NULL, 1
 - Client1, 27.03.2013, NULL, 1
 - Client1, 15.05.2013, NULL, 1

该表包含数百万条记录和50万个客户端。我的目标是将这些数据转换为类似客户端的状态:

 - Client, Date, Status
 - Client1, 14.11.2012, 'Mixed'
 - Client1, 01.12.2012, 'Unprocessed'
 - Client1, 01.01.2012, 'Unprocessed'
 - Client1, 13.01.2013, 'Slept'
 - Client1, 01.02.2013, 'Slept'
 - Client1, 06.02.2013, 'Processed'
 - Client1, 01.03.2013, 'Unprocessed'
 - Client1, 27.03.2013, 'Processed'
 - Client1, 01.04.2013, 'Unprocessed'
 - Client1, 01.05.2013, 'Unprocessed'
 - Client1, 15.05.2013, 'Processed'
 - Client1, 01.06.2013, 'Unprocessed'
 - Client1, 01.07.2013, 'Unprocessed'
 - Client1, 23.07.2013, 'Slept'
 - Client1, 01.08.2013, 'Slept'
 - Client1, 01.09.2013, 'Slept'
 - Client1, 01.10.2013, 'Slept'
 - Client1, 01.11.2013, 'Slept'
 - Client1, 01.12.2013, 'Slept'
 - Client1, 01.01.2014, 'Slept'
 - Client1, 10.01.2014, 'Left'

转换的简短算法是:

  1. 如果它是第一行且Trial = 1且Full = 1则则Status =' Mixed'
  2. 如果一个月的第一天没有数据,则Status =' Unprocessed'
  3. 如果过了60天且没有包含Full = 1的记录,则Status ='睡眠'
  4. 如果240天过去且没有包含Full = 1的记录,则Status =' Left'
  5. 如果有一个月的第一天和以前的状态='睡觉'然后 状态='睡觉
  6. 我跳过很多案例,因为算法不是问题,而是工具。

    为了在SQL中转换数据,我使用了以下表达式:

    • row_number()over([客户]按[Date] asc分区)
    • 滞后([日期],1)结束(由[日期] desc按[客户]顺序划分)
    • DATEADD(天,1,EOMONTH([日期]))
    • 递归

    我觉得它不能成为转换数据的最快方式,而且多路径(将每个客户端置于不同的位置)可能会非常有帮助,不确定sql有多好。在大量额外案件之后,我的执行计划非常庞大。

    所以,我的问题是哪种工具最好转换这样的数据?编程语言可能会更好地处理这种方式吗?

    更新:我准备了所请求的SQL代码。随意找到任何问题: http://pastebin.com/3nCdfquG

1 个答案:

答案 0 :(得分:1)

以下假设您一次处理一个客户,例如处理客户报告

我已经使用了您提供的数据集,上传到名为resume的表格中,并且应用了以下索引,这可能有点过分,因为它实际上创建了数据的副本,但使事情快速变亮:

ClientData

然后我根据给定的create nonclustered index ix_CientData_Client_Date on dbo.ClientData(Client,Date) include (Trial,[Full]) ID创建了一个日期表,从他们的第一个Client值到他们上一个Date值+ 240天或今天的较小者。

然后,您可以从此表中过滤掉所有无用的日期。 Date该数据集自身获取前一行Join行并处理您的ClientData逻辑。

由于您没有包含整套逻辑流程,我已尽力完成,如果您开始更改内容,请留下Status条消息。我发现这有助于确定ERROR陈述为什么不能完成我想要的事情:

case