从特定日期之后的第一个日期中选择数据(已加入两个表)

时间:2017-02-14 19:04:30

标签: sql-server date join min

我已经搜索过,但似乎无法将其准确地发送到我需要的地方。这与Microsoft SQL Server有关。

我希望加入两个表,但只在第一个表中的日期之后的第一个日期从第二个表中提取数据。请参阅下面的代码。

我有一张表格,显示发送给客户的电子邮件,如下所示:

SELECT
  e.Name
  ,se.SubscriberID
  ,se.SendID
  ,c1.Id
  ,ds.Service_Num
  ,sub.EmailAddress
  ,se.EventDate as 'SentDate'
  into #temp_billing_emails
FROM
  bi_views.dbo.sfdcMC_SentEvent se
  left join bi_views.dbo.sfdcmc_job j on j.jobid=se.sendid
  left join bi_views.dbo.sfdcMC_Email e on e.id=j.emailid
  left join bi_views.dbo.sfdcMC_Subscriber sub on sub.id=se.SubscriberID
  left join sfdcprod.dbo.contact c1 on sub.subscriberkey=c1.id
  left join bi_views.dbo.DIM_SERVICE_RF ds on c1.id=ds.ContractSignerContactID_bk
WHERE
  e.name like '%Past Due%'

从那里,我想知道电子​​邮件接收者在收到的电子邮件之后花了多少天进行首次付款。我已经得到了这个:

SELECT
  e.*
  ,z.zuora__createddate__c
  ,z.zuora__status__c
  ,z.zuora__amount__c
  ,datediff(dd,e.sentdate,z.Zuora__CreatedDate__c) DaysToPay    
FROM
  #temp_billing_emails e
  left join sfdcprod.dbo.Service__C sc on e.Service_Num = right(sc.name,len(sc.name)-2)
  left join sfdcprod.dbo.[zuora__customeraccount__c] a on sc.billing_account__c=a.id
  left join sfdcprod.dbo.[zuora__payment__c] z on a.id=z.zuora__billingaccount__c
WHERE
  datediff(dd,e.sentdate,z.Zuora__CreatedDate__c)>=0
  and z.zuora__status__c not like 'Error'

这可以让我收到客户收到电子邮件后所支付的所有款项。我需要的只是他们的第一笔付款金额以及电子邮件之后的日期。

我尝试了这样的MIN()函数:

SELECT TOP 100
  e.EmailAddress
  ,e.SentDate
  ,e.Service_Num
  ,z.zuora__createddate__c
  ,z.zuora__status__c
  ,z.zuora__amount__c
  ,datediff(dd,e.sentdate,min(z.Zuora__CreatedDate__c)) DaysToPay   
FROM
  #temp_billing_emails e
  left join sfdcprod.dbo.Service__C sc on e.Service_Num = right(sc.name,len(sc.name)-2)
  left join sfdcprod.dbo.[zuora__customeraccount__c] a on sc.billing_account__c=a.id
  left join sfdcprod.dbo.[zuora__payment__c] z on a.id=z.zuora__billingaccount__c
WHERE
  datediff(dd,e.sentdate,z.Zuora__CreatedDate__c)>=0
  and z.zuora__status__c not like 'Error'
GROUP BY
  e.EmailAddress
  ,e.SentDate
  ,e.Service_Num
  ,z.zuora__createddate__c
  ,z.zuora__status__c
  ,z.zuora__amount__c

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:1)

outer apply()是解决此类问题的好方法。

select
    e.Name
  , se.SubscriberID
  , se.SendID
  , c1.Id
  , ds.Service_Num
  , sub.EmailAddress
  , se.EventDate as 'SentDate'
  , x.zuora__createddate__c
  , x.zuora__status__c
  , x.zuora__amount__c
  , DaysToPay = datediff(day,se.EventDate,x.Zuora__CreatedDate__c)
from bi_views.dbo.sfdcMC_SentEvent se
  inner join bi_views.dbo.sfdcmc_job j on j.jobid=se.sendid
  inner join bi_views.dbo.sfdcMC_Email e on e.id=j.emailid and e.name like '%Past Due%'
  left join bi_views.dbo.sfdcMC_Subscriber sub on sub.id=se.SubscriberID
  left join sfdcprod.dbo.contact c1 on sub.subscriberkey=c1.id
  left join bi_views.dbo.DIM_SERVICE_RF ds on c1.id=ds.ContractSignerContactID_bk
     outer apply (
        select top 1 
              z.zuora__createddate__c
            , z.zuora__status__c
            , z.zuora__amount__c
            from sfdcprod.dbo.Service__C sc 
              inner join sfdcprod.dbo.[zuora__customeraccount__c] a 
                on sc.billing_account__c=a.id
               and ds.Service_Num = right(sc.name,len(sc.name)-2)
              inner join sfdcprod.dbo.[zuora__payment__c] z 
                on a.id=z.zuora__billingaccount__c
               and z.zuora__status__c not like 'Error'
               and z.Zuora__CreatedDate__c >= se.EventDate
            order by z.Zuora__CreatedDate__c asc
          ) as x

我认为这是没有临时表的情况:

jQuery