2016-11-23 95 views
0

我使用SQL Server 2014如何获得由SELECT语句返回的结果的最大价值

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

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,但我不知道这是否是支持

回答

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

+0

这样,我在结果集中重复了3000次MaxValue(s)。这将是沉重的网络和客户端应用程序的潜在内存。 –

+0

围绕此查询添加包装查询,并仅选择具有不同值的最大值。运行查询并查看结果不假设关于advane – Tassadaque

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列到你的结果(每行具有相同的值)的权利。

+0

@Erc中的性能:此方法将重复给结果集的每一行的最大列数。有什么办法可以将它分解为两个结果集? –

+0

类别。而不是交叉连接,你可以使用“ON false”的完整外连接,这会给你 – Eric

+0

(对不起。我很快就回到了Enter,出于某种原因我不能编辑以前的注释。)而不是'FROM q CROSS JOIN m',你可以使用'q FULL OUTER JOIN m On false'。您仍然会有两个额外的列,但在来自主查询的行中,最大列将是空的,并且末尾会有一个额外的行,在最大列中将有数据* only *其他列 - PrimaryKeyID,ColA等 - 将是空的)。 – Eric

0

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

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

SELECT max(PrimaryKeyID) MaxPrimaryKeyID, max(CreateDate) MaxCreateDate  
FROM VeryHeavyView 
WHERE Condtion < 123 

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