我已经阅读了功能性编程背后的概念,这让我重新考虑我的做事方式。
例如,有一个表:
- 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'
转换的简短算法是:
我跳过很多案例,因为算法不是问题,而是工具。
为了在SQL中转换数据,我使用了以下表达式:
我觉得它不能成为转换数据的最快方式,而且多路径(将每个客户端置于不同的位置)可能会非常有帮助,不确定sql有多好。在大量额外案件之后,我的执行计划非常庞大。
所以,我的问题是哪种工具最好转换这样的数据?编程语言可能会更好地处理这种方式吗?
更新:我准备了所请求的SQL代码。随意找到任何问题: http://pastebin.com/3nCdfquG
答案 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