我已閱讀函數式編程背後的概念,這讓我重新考慮自己的做事方式。使用其他表格中的數據填充表格的最快方法
例如,有一個表:
- 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和全= 1,則狀態=「混合」
- 如果沒有爲一個月,然後狀態的第一天,沒有數據=「未處理」
- 如果在60天過後,並沒有包含全部= 1個,那麼狀態沒有記錄=「睡」
- 如果240天過去了,有包含完整= 1個,那麼狀態沒有記錄=「左」
- 如果比上月和上地位=「睡」然後 狀態=「第一天睡
有我跳過了很多情況,因爲算法不是問題,而是工具。
爲了SQL內變換數據I使用下面的表達式:
- ROW_NUMBER()以上(分區由[客戶]由[日期]遞增順序)
- 滯後([日期],1 )以上(分區由[客戶]爲了通過[日期]降序)
- DATEADD(天,1,EOMONTH([日期]))
- 遞歸
- 等
我有感覺,它不能是最快的方式來轉換數據,也多步驟(把每個客戶端分開踩)可能是非常有用的,不知道sql有多好。大量額外案例後,我的執行計劃非常龐大。
所以,我的問題是什麼工具是最好的轉換這種數據呢?編程語言可以處理更好的方式嗎?
更新:我準備了請求的SQL代碼。隨意找到的任何問題: http://pastebin.com/3nCdfquG
您可以發佈您的SQL你已經有了?索引數據的性能如何?這聽起來不像SQL對於高效完成應該太難。 – iamdave
只要可以理解你真正想要完成的事情,SQL將執行任何轉換並插入就好。 – ajeh
我只是想知道我的方法是否得到了充分考慮。稍後會放置代碼,也許sql確實足夠了,我的代碼設計不好。 – user1464922