2014-10-20 124 views
0

以下是通过Business Objects包执行的T-SQL。我的问题是,是否有完成下列聚集的查询较短方式:SQL汇总

(SELECT tblName.Details 
FROM tblName 
WHERE tblName.ID = (SELECT Max(tblName2.ID) 
         FROM tblName tblName2 
         WHERE tblMainQuery.id = tblName2.id 
          AND tblName2.StartDate = (SELECT Max(tblName3.StartDate) 
                 FROM tblName tblName3 
                 WHERE tblMainQuery.id = tblName3.id))) 

tblMainQuery.id是一个场,这使得它的相关子查询。所以总而言之,我想将这个整个查询作为一个子查询来实现,其中我想检索最近开始日期的id,但是由于最近的开始日期可能会返回多个记录,下降到主键级别并检索最高主键。

我知道使用CTE会有所帮助,但这是不可能的,因为它必须通过Business Objects Web Intelligence执行 - 这不受支持。

回答

1

我可能会尝试ROW_NUMBER。按startDate排序以获取最大startDate,再按ID排序以获取属于max StartDate的最大ID。然后,选择只记录与ROW_NUMBER = 1

+1

这种方法使用更少的代码,并且只有一个子查询,所以在我所要求而言是正确的。不知道对执行时间有什么影响,因为它们似乎是相同的,但代码少的几乎总是一件好事,所以谢谢。 – cope 2014-10-21 09:12:32

0

试试这个

SELECT * 
FROM tblName A 
     JOIN (SELECT TOP 1 Row_number() 
          OVER (
           ORDER BY startdate, id) row_n, 
          * 
      FROM tblName 
      ORDER BY row_n DESC) B 
     ON A.id = b.id 
+0

不幸的是,无法实现cte方法,请参阅推理问题的最后一段。 – cope 2014-10-20 16:15:13

+0

@cope - 现在检查 – 2014-10-20 16:17:34