Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL查找最后两个MAX()次_Sql Server_Tsql_Max - Fatal编程技术网

Sql server T-SQL查找最后两个MAX()次

Sql server T-SQL查找最后两个MAX()次,sql-server,tsql,max,Sql Server,Tsql,Max,我需要从一个大表(100000+条记录)中获取四个开始和停止日期 我正在制作一个包含一些数据的表格,其中一个广告正在我们的系统中移动,我必须找出广告最后两次被制作的时间 我可以通过使用像这样的MAX函数来获得最后一次 为简单起见: Select MAX(DateEntered) AS LastTimeStartDate From myTable where field1 = 'Whohasit' and appname2 ='Ad Workflow' Select MAX(DateEn

我需要从一个大表(100000+条记录)中获取四个开始和停止日期 我正在制作一个包含一些数据的表格,其中一个广告正在我们的系统中移动,我必须找出广告最后两次被制作的时间

我可以通过使用像这样的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 开始2:2011-11-02 19:28:22.303停止2:2011-11-02 19:32:35.467

谢谢 我的桌子想要下一张:

下面是我用来获取所需最大日期的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
选择(e.Firstname+“”+e.Lastname)作为名称,awa.Revisionno,awa.DateAssigned,awa.dateAdcompleted,ao.artComplDate,awa.adorderId,nsdac.newStartDateAc,nsdar.newStartDateAR,ned.newEndDate,
当

DateDiff(hh,AWFE.dbo.getFridayOffset(COALESCE(newStartDateAR,newStartDateAc)),COALESCE(newEndDate,awa.dateAdcompleted,ao.artComplDate,null))我是如何着手解决这个问题的,可能不是最有效的方法,但我是这样做的。 我创建了一个包含所需日期的表视图。在分区上使用RANK(),如下所示:

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专家,这方面的性能还可以。100000多条记录大约需要4秒,我希望将其减半,因此我仍在寻找其他解决方案。

您尝试过什么?如果你想按要求编写代码,那么你应该雇佣一位顾问。堆栈溢出用于帮助解决特定问题。这个问题还不够清楚。是单个广告行列表中的所有行吗?。在有效的查询中,您的过滤器显示“field1”=“whohasit”,您的意思是“where whohasit='ad return'”吗?看起来“whohasit”是一个字段名,没有名为“field1”的字段。很高兴能给出您想要的结果,但我看不出您显示的“start1”和“stop1”值之间有任何关系——我怎么知道它们是同时出现的呢。表中是否有其他字段,是否有唯一的键-一个值保证在表中只出现一次的列。特别有趣的是,示例数据没有“Ad Workflow”条目=)此外,我看不出为什么stop2应该是2011-11-02 19:32:35.467,而不是下面的或上面的2。非常混乱。txs无论如何我已经弄明白了。。。
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