2015-09-07 60 views
1

new_commsstream列計算,如果上一行的date,通過persondid分區和其他一些欄目,包括子查詢date有序,大於90天,如果是,則返回1和否則爲0:排在分區與案例的SQL Server

create view Motability_Dataset_Staging_cmp as 
    select 
    mdsc.PersonID, 
    mdsc.AddressID, 
    mdsc.Email, 
    mdsc.Reportdate_month, 
    mdsc.Channel, 
    mdsc.CommsMedium, 
    mdsc.Campaign_Name, 
    mdsc.Category, 
    mdsc.MRM_Campaign_code, 
    mdsc.Action_id, 
    mdsc.NumSents, 
    mdsc.ReportDate, 
    isnull(cmp.ppersonid,mdsc.PersonID) as Prev_PersonID, 
    isnull(cmp.paddressid,mdsc.AddressID) as Prev_AddressID, 
    isnull(cmp.pmrmcampaigncode,mdsc.MRM_Campaign_code) as Prev_MRMCampaignCode, 
    isnull(cmp.pactionid,mdsc.Action_id) as Prev_ActionID, 
    isnull(cmp.preportdate,mdsc.ReportDate) as Prev_ReportDate, 
    isnull(cmp.commsdaysinterval,0) as Prev_CommsDays, 
    isnull(cmp.newcommsstream,0) as New_CommsStream 

    from Motability_Dataset_Staging as mdsc 
    left join 
     (select 
     cmp.row +1 as row,pcmp.row as prow, 
     cmp.personid as personid,pcmp.personid as ppersonid, 
     cmp.addressid as addressid,pcmp.addressid as paddressid, 
     cmp.MRM_Campaign_code as mrmcampaigncode,pcmp.MRM_Campaign_code as pmrmcampaigncode, 
     cmp.Action_id as actionid,pcmp.Action_id as pactionid, 
     cmp.reportdate as reportdate,pcmp.reportdate as preportdate, 
     datediff(day,cmp.ReportDate,pcmp.ReportDate) as commsdaysinterval, 
     case when datediff(day,cmp.ReportDate,pcmp.ReportDate) <-90 then 1 else 0 end as newcommsstream 
     from 
     (select row_number() over(partition by personid order by personid,addressid,reportdate,mrm_campaign_code,action_id)-1 as row,personid,addressid,MRM_Campaign_code,action_id,reportdate from Motability_Dataset_Staging) cmp 
     inner join (select row_number() over(partition by personid order by personid,addressid,reportdate,mrm_campaign_code,action_id) as row,personid,addressid,MRM_Campaign_code,action_id,reportdate from Motability_Dataset_Staging) pcmp on cmp.row = pcmp.row and cmp.personid=pcmp.personid 
     ) cmp 
    on mdsc.PersonID = cmp.personid and mdsc.AddressID = cmp.addressid and mdsc.MRM_Campaign_code=cmp.mrmcampaigncode 

我掙扎,然後通過人的ID new_commsstream所以每次分區,並有將其添加否則新的行數相同personid內的1回1:

personid new_commsstream row 
1  0  1 
1  0  1 
1  0  1 
1  1  2 
1  0  2 
2  0  1 
3  0  1 
4  0  1 
5  0  1 
5  1  2 
5  1  3 

任何想法如何實現這一目標?

謝謝。

+0

沒有人有任何想法如何完成這90天的部分呢?謝謝 – user5308203

回答

0

我不確定它是否有幫助,但不需要爲ROW_NUMBER()兩次選擇數據。 你只需把它變成一個SQL Server CTE exression如下 然後,你可以參考它的兩倍

;with cmp as (
    select 
     row_number() over(partition by personid order by addressid,reportdate,mrm_campaign_code,action_id) as row, 
     personid, 
     addressid, 
     MRM_Campaign_code, 
     action_id, 
     reportdate 
    from Motability_Dataset_Staging 
), cmp2 as (
    select 
     cmp2.*, -- previous values 
     cmp.* -- 
    from cmp 
    left join cmp as cmp2 -- previous 
     cmp.row = cmp2.row + 1 
) 
select 
mdsc.PersonID, 
mdsc.AddressID, 
mdsc.Email, 
mdsc.Reportdate_month, 
mdsc.Channel, 
mdsc.CommsMedium, 
mdsc.Campaign_Name, 
mdsc.Category, 
mdsc.MRM_Campaign_code, 
mdsc.Action_id, 
mdsc.NumSents, 
mdsc.ReportDate, 
isnull(cmp.ppersonid,mdsc.PersonID) as Prev_PersonID, 
isnull(cmp.paddressid,mdsc.AddressID) as Prev_AddressID, 
isnull(cmp.pmrmcampaigncode,mdsc.MRM_Campaign_code) as Prev_MRMCampaignCode, 
isnull(cmp.pactionid,mdsc.Action_id) as Prev_ActionID, 
isnull(cmp.preportdate,mdsc.ReportDate) as Prev_ReportDate, 
isnull(cmp.commsdaysinterval,0) as Prev_CommsDays, 
isnull(cmp.newcommsstream,0) as New_CommsStream 
from Motability_Dataset_Staging as mdsc 
inner join cmp on ...... 
+0

感謝您的回覆。當我嘗試運行CTE部件時,出現cmp2多次指定行的錯誤? – user5308203

+0

認爲這事做: '選擇 CMP2 *, - 以前的值 CMP *' 我試圖明確規定的所有列,但它仍然得到一個錯誤。 – user5308203

+0

您可以像在示例中那樣更改上一個表中的列名稱,例如在末尾或開頭添加一些標識符 – Eralper