如何获取SELECT语句返回的结果的MAX值

时间:2016-11-23 19:00:35

标签: sql sql-server tsql sql-server-2014

我正在使用SQL Server 2014。

我需要将以下查询的结果发送到客户端应用程序:

SELECT PrimaryKeyID, ColA, ColB, ColC , CreateDate 
FROM VeryHeavyView 
WHERE Condtion<123

我需要将Max(PrimaryKeyID)Max(CreateDate)记录到日志表中。

我喜欢用开销来做。最有效的方法是什么?

更新1

以下是一些如何做到这一点的想法,但我想我在这里发帖提问,看看是否有更好或更有效的方法:

  • 我可以通过查询两次来做到这一点,但效率不高
  • 我知道我可以将结果存储到临时表中,并将SELECT MAX存储到临时表
  • 我可以按所有列进行分组。这是非常昂贵的,因为我使用的实际查询非常昂贵,结果是3000行。

  • 我可以查询SELECT @Var1=PrimaryKeyID, ColA, ColB, ColC , @Var2=CreateDate FROM VeryHeavyView ORDER BY PrimaryKeyID,但我不确定是否支持

3 个答案:

答案 0 :(得分:1)

您可以编写查询和查询,计算您想要的两个最大值作为公用表表达式,然后将两者交叉连接在一起。

WITH
q AS (
    SELECT PrimaryKeyID, ColA, ColB, ColC , CreateDate 
    FROM VeryHeavyView 
    WHERE Condtion<123
),
m AS (
    SELECT max( PrimaryKeyID ) AS max_id,
           max( CreateDate ) AS max_create_date
    FROM q
)

SELECT q.*, m.*
FROM q CROSS JOIN m

由于第二个CTE(m)应该只返回一行,这只会将max_id和max_create_date列附加到结果的右侧(每行都有相同的值)。

答案 1 :(得分:0)

您可能需要窗口聚合功能

SELECT Max(PrimaryKeyID) over (order by PrimaryKeyID desc),
, ColA, ColB, ColC , 
Max(CreateDate) over (order by CreateDate desc)
FROM SomeTable 
WHERE Condtion<123

您可以学习更多here

答案 2 :(得分:0)

根据我的经验,如果您在存储过程中执行此操作,则可以运行查询以获取最大值并执行相同的查询以获取所有最大值,并且您不会真正添加任何时间假设查询计划被缓存,则为执行时间。

连续运行这2个查询,可能与运行其中一个查询的时间相同,但会给你2个结果。

<input name="ROS_services" type="radio" name="display" id="display1" />
<input name="ROS_services" type="radio" name="display" id="display2" />
<input name="ROS_services" type="radio" name="display" id="display3" />

<br />
<br />

<label for="display1">label1</label><br />
<label for="display2">label2</label><br />
<label for="display3">label3</label><br />