【问题标题】:SQL aggregationSQL 聚合
【发布时间】:2014-12-15 15:24:12
【问题描述】:

以下是通过业务对象包执行的 T-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 执行 - 不支持。

【问题讨论】:

    标签: sql sql-server aggregation


    【解决方案1】:

    我可能会尝试ROW_NUMBER。按 startDate 排序以获得最大 startDate,进一步按 ID 排序以获得属于最大 StartDate 的最大 ID。然后只选择ROW_NUMBER = 1 的记录。

    【讨论】:

    • 这种方法使用的代码更少,只有一个子查询,所以就我所问的而言,它是正确的。不确定对执行时间有什么影响,因为它们看起来是相同的,但更少的代码几乎总是一件好事,所以谢谢。
    【解决方案2】:

    试试这个

    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 
    

    【讨论】:

    • 遗憾的是无法实现 cte 方法,请参阅问题的最后一段进行推理。
    猜你喜欢
    • 2018-01-11
    • 2010-09-26
    • 2012-11-06
    • 2020-10-05
    • 2014-08-30
    • 2012-09-09
    • 2011-01-31
    • 2015-12-26
    • 2014-12-27
    相关资源
    最近更新 更多