我需要從一個大表(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爲尋找...
你有什麼嘗試?如果你想按代碼做代碼,那麼你應該聘請一名顧問。堆棧溢出是針對特定問題的幫助。 – JNK
這個問題還不夠清楚。單個廣告的行列表中的所有行都是?在有效的查詢中,您的過濾器會顯示「field1」=「whohasit」,您的意思是「where whohasit ='ad return'」 - 它看起來像「whohasit」是一個字段名稱,沒有名爲「Field1 」。能夠給出你想要的結果真是太好了,但是我看到你爲「start1」和「stop1」顯示的值之間沒有任何關係 - 我怎麼能知道這些結果一起出現。表中還有其他字段,並且是否有唯一的鍵 - 一個值保證在表中只出現一次的列。 –
特別有趣的是,樣本數據沒有「廣告工作流」條目=)此外,我沒有看到爲什麼stop2應該是2011-11-02 19:32:35.467,而不是上面的2或下面的2。很混亂。 – deroby