2016-11-23 53 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