T-SQL находит последние два MAX () раза - PullRequest
2 голосов
/ 09 декабря 2011

Мне нужно получить четыре даты начала и окончания из большой таблицы (более 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: 45.830 stop1: 2011-11-01 16: 25: 05.740 start2: 2011-11-02 19: 28: 22,303 stop2: 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

Я должен понять, что искать ...

1 Ответ

1 голос
/ 12 декабря 2011

Как я решил эту проблему, возможно, не самый эффективный способ, но вот как я это сделал.Я создал вид таблицы, в которой указаны нужные мне даты.Используя 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, и с этим все в порядке.100 000+ записей занимает около 4 секунд. Мне нравится сокращать его вдвое, поэтому я все еще смотрю на другие решения.

...