2011-12-09 28 views
2

我需要從一個大表(100,000+)個記錄中獲取四個開始和結束日期日期 我正在處理包含廣告移動時的一些數據的表通過我們的系統,我必須找出最後兩次廣告的製作過程。T-SQL找到最後兩個MAX()次

我可以用這樣的

爲簡單起見,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次。

因此,使用下表我需要以下四個日期

啓動1:2011-11-01 16:21:45.830停止1:2011-11-01 16:25:05.740 START2:2011- 11-02 19:28:22.303停止2:2011-11-02 19:32:35.467

由於 我的表想下列之一:

Whohasit  dateentered        appname2 
Complete  2011-11-15 06:26:16.680     Ad Workload 
Proofing  2011-11-14 14:50:41.350     Automated Flows 
Proofing  2011-11-14 14:50:41.500     Automated Flows 
Complete  2011-11-08 07:09:59.353     Ad Workload 
Proofing  2011-11-03 08:24:29.520     Online Proofs Update 
Proof-Pend 2011-11-02 19:32:46.983     Ad Workload 
Proof-Pend 2011-11-02 19:32:38.147     Automated Flows 
Proofing  2011-11-02 19:32:38.143     Automated Flows 
Proofing  2011-11-02 19:32:38.200     Automated Flows 
Proof-Pend 2011-11-02 19:32:35.467     Automated Flows 
Proofing  2011-11-02 19:32:35.467     Automated Flows 
Proofing  2011-11-02 19:32:34.887     Automated Flows 
Ad Return  2011-11-02 19:29:55.350     Uploads Done Transfer 
Ad Return  2011-11-02 19:28:22.303     Ad Workload 
Ad Return  2011-11-02 15:40:48.470     File Attach 
Ad Return  2011-11-02 15:40:00.100     Order Entry 
Ad Return  2011-11-02 15:40:00.970     Order Entry 
Proof-Pend 2011-11-02 15:40:00.800     Order Entry 
Proof-Pend 2011-11-01 16:25:17.533     Ad Workload 
Proof-Pend 2011-11-01 16:25:05.740     Automated Flows 
Proofing  2011-11-01 16:25:05.737     Automated Flows 
Proofing  2011-11-01 16:25:05.610     Automated Flows 
Ad Return  2011-11-01 16:23:26.457     Uploads Done Transfer 
Ad Return  2011-11-01 16:21:45.830     Ad Workload 

這裏,我用來獲取日期的最大的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 

我必須想出辦法來的TXS爲尋找...

+4

你有什麼嘗試?如果你想按代碼做代碼,那麼你應該聘請一名顧問。堆棧溢出是針對特定問題的幫助。 – JNK

+1

這個問題還不夠清楚。單個廣告的行列表中的所有行都是?在有效的查詢中,您的過濾器會顯示「field1」=「whohasit」,您的意思是「where whohasit ='ad return'」 - 它看起來像「whohasit」是一個字段名稱,沒有名爲「Field1 」。能夠給出你想要的結果真是太好了,但是我看到你爲「start1」和「stop1」顯示的值之間沒有任何關係 - 我怎麼能知道這些結果一起出現。表中還有其他字段,並且是否有唯一的鍵 - 一個值保證在表中只出現一次的列。 –

+0

特別有趣的是,樣本數據沒有「廣告工作流」條目=)此外,我沒有看到爲什麼stop2應該是2011-11-02 19:32:35.467,而不是上面的2或下面的2。很混亂。 – deroby

回答

1

如何我去約解決這個問題可能不是最有效的方法,但是,我是這麼做的。 我創建了具有我需要的日期的表的視圖。使用RANK()OVER PARTITION象下面這樣:

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專家,在這方面的表現還不錯。 10萬條記錄需要4秒左右的時間我喜歡把它削減一半,所以我仍然在尋找其他解決方案。