我需要从一个大表(100,000+)记录中获得四个开始日期和停止日期,我正在处理一个包含广告在我们的系统中移动的数据的表,并且我必须找出广告已经处理过的最后两次。
我可以通过使用下面这样的MAX函数来获得最后一次
为了简单起见:
Select MAX(DateEntered) AS LastTimeStartDate
From myTable
where field1 = 'Whohasit' and appname2 ='Ad Workflow'
Select MAX(DateEntered) AS LastTimeEndDate
From myTable
where field1 = 'Whohasit' and appname2 ='Automated Flows'我需要做的是在MAX()之前找到最后的开始和停止时间,所以如果这个广告已经停止并启动了10次,我必须找到最后两个开始和结束时间。这将是第9和第10次。
因此,使用下表,我需要以下四个日期
start1 : 2011-11-01 16:21:21:45.830 stop1 :11-11-01 16:25:05.740 start2 : 2011-11-02 19:28:22.303 stop2 : 2011-11-02 19:32:35.467
谢谢,我的桌子想要下面那张:
2011年广告工作量校对2011-11-03 08:24:29.520在线校对更新证明-2011年-11-02 19:32:46.983广告工作量证明-2011年-11-02 19:32:38.147自动流校对2011-11-02 19:32:38.143自动流校对2011-11-02 19:32:38.200自动流程验证-Pend 2011-02 19:32:35.467自动流校对2011-11-02 19:32:35.467自动流校对2011-11-02 19:32:34.887-02 19:28:22.303广告工作负荷广告回报2011年-11-02 15:40:48.470文件附加广告回报2011年-11-02 15:40:00.100订单进入广告返回2011-02 15:40:00.970订单输入证明-2011-01 16:25:17.533广告工作量证明-2011年-11-01 16:05.740自动流校对2011-11-01 16:05.737自动流校对2011-11-01 16:25:05.610自动流广告返回2011-11-01 16:23:26。457上传完成传输广告返回2011-11-01 16:21:45.830广告工作量
在这里,我使用了SQL代码来获取我需要的最大日期:
Select (e.Firstname + ' ' + e.Lastname) as Name, awa.Revisionno,awa.DateAssigned, awa.dateAdcompleted,ao.artComplDate, awa.adorderId, nsdac.newStartDateAc, nsdar.newStartDateAR,ned.newEndDate,
CASE WHEN
DateDiff(hh, AWFE.dbo.getFridayOffset(COALESCE(newStartDateAR,newStartDateAc)), COALESCE(newEndDate,awa.dateAdcompleted,ao.artComplDate,null)) <= 24 THEN 1 ELSE 0 END AS Hit1,
CASE WHEN
DateDiff(hh,AWFE.dbo.getFridayOffset(COALESCE(newStartDateAR,newStartDateAc)), COALESCE(newEndDate,awa.dateAdcompleted,ao.artComplDate,null)) <= 48 THEN 1 ELSE 0 END AS Hit2,
DateDiff(hh, AWFE.dbo.getFridayOffset(COALESCE(newStartDateAR,newStartDateAc)),COALESCE(ned.newEndDate, awa.dateAdcompleted,ao.artComplDate,null)) As Hours
from AdWorkAssignment awa
JOIN Employee as e ON e.EmployeeId = awa.EmployeeId
JOIN adOrder as ao ON ao.AdOrderid = awa.AdOrderId
LEFT OUTER JOIN (select adCopyId, MAX(dateentered) as newStartDateAC from adcopylog WHERE appname2 = 'Ad Workload' and whohasitid = 'Ad Creation' group by adCopyId) nsdac on nsdac.adCopyId =awa.AdOrderId
LEFT OUTER JOIN (select adCopyId, MAX(dateentered) as newStartDateAR from adcopylog WHERE appname2 = 'Ad Workload' and whohasitid = 'Ad Return' group by adCopyId) nsdar on nsdar.adCopyId =awa.AdOrderId
LEFT OUTER JOIN (select adCopyId, MAX(dateentered) as newEndDate from adcopylog WHERE appname2 = 'Automated Flows' and whohasitid = 'Proof-Pend' group by adCopyId) ned on ned.adCopyId =awa.AdOrderId
WHERE
awa.DateAssigned BETWEEN dbo.ToStartDate('11/01/2011') AND dbo.ToEndDate('11/30/2011')
AND ao.ProofFlag = 1 AND ao.NewMediaFlag = 1 AND awa.VendorId = 'SHOP'
order by hit1,hit2我已经想出了寻找.
发布于 2011-12-12 18:04:22
我如何解决这个问题可能不是最有效的方法,但是,下面是我是如何做到的。我创建了一个表的视图,它有我需要的日期。在分区上使用秩(),如下所示:
select adcopyid, appname2,dateentered,whohasitid,
RANK() OVER (PARTITION BY adcopyid ORDER BY dateentered desc) "rank"
from adcopylog
WHERE appname2 = 'Automated Flows' and whohasitid = 'Proof-Pend' 然后,在我的联接中,我只使用下面这样的简单选择来引用这个视图。
JOIN (select adcopyid,(dateentered)as newEndDate from awfe.dbo.copylog WHERE rank = 1) ned on ned.adCopyId =awa.AdOrderId
JOIN (select adcopyid,(dateentered)as newEndDate2 from awfe.dbo.copylog WHERE rank = 2) ned2 on ned2.adCopyId =awa.AdOrderId现在我有了我最需要的两次约会。现在我不是sql专家,在这方面的性能也不错。我喜欢把它切成两半,所以我还在寻找其他的解决方案。
https://stackoverflow.com/questions/8448730
复制相似问题