2010-09-05 23 views
1

the following
其上運行的Stack Exchange Data Explorer查詢,它使用一個SQL Azure中實現的OData的FAQ說,它支持大多數TSQL命令的):如何在SQL中使用變量或引用?

DECLARE @MinPosts int = ##MinNumberOfPosts## 
SELECT 
    Id AS [User Link], 
    Reputation, 
    (SELECT COUNT(*) 
    FROM posts 
    WHERE posts.OwnerUserId = Users.Id 
    ) AS [# Posts], 
    Reputation/
    (SELECT COUNT(*) 
    FROM posts 
    WHERE posts.OwnerUserId = Users.Id 
    ) AS [Rep Per Post] 
FROM Users 
WHERE (SELECT COUNT(*) 
    FROM posts 
    WHERE posts.OwnerUserId = Users.Id 
    ) > @MinPosts 
ORDER BY [Rep Per Post] DESC 

我寫出:

(SELECT COUNT(*) 
FROM posts 
WHERE posts.OwnerUserId = Users.Id) 

三次。 如何爲上述代碼片段創建變量或函數?

我嘗試使用列別名[# Posts],但沒有奏效。

我找到了these posts關於重新使用計算的提交名稱進行進一步計算,這似乎是我想要的,但我無法弄清楚如何應用它。

+1

什麼味道的SQL? – 2010-09-05 05:56:41

+0

FAQ說T-SQL。我已相應標記。 – BoltClock 2010-09-05 06:06:04

+0

@BoltClock - 謝謝。看起來像'數據庫託管在SQL Azure上。 SQL Azure支持大多數的TSQL命令, – 2010-09-05 06:10:17

回答

3

因爲你需要爲整個數據庫中每個用戶每一個崗位的數量,因此,只是做了簡單的方法:

SELECT 
    Id AS [User Link], 
    Reputation, 
    Reputation * 1.0/C.Cnt AS [Rep Per Post] 
FROM 
    Users U 
    INNER JOIN (
     SELECT OwnerUserId, Cnt = Count(*) 
     FROM posts 
     GROUP BY OwnerUserID 
     HAVING Count(*) >= ##MinNumberOfPosts## 
    ) C ON U.Id = C.OwnerUserId 
ORDER BY [Rep Per Post] DESC 

您可能會發現這給出與CROSS APPLY解決方案相同的執行計劃,但這只是因爲引擎足夠聰明以避免相關的子查詢並將其切換爲簡單的聚合,因爲此查詢明確表示。如果CROSS APPLY真的表現更好,我很想知道爲什麼。

P.S.我加了* 1.0,因爲我猜測(不知道引擎在這裏)整數除法產生整數,看起來你可能想要分數。你必須嘗試。

+0

謝謝。我確實顯示了整數,只是爲了看起來更清晰。 「聲望* 1.0」和「CAST(聲譽AS浮點數)」是否一樣?寫得更快。 – 2010-09-05 20:07:17

+1

我認爲1.0和鑄造成十進制一樣。有可能它比明確演員稍慢,但我懷疑它會有任何性能暗示。爲了達到這些目的,十進制與浮點數不會有關係。 – ErikE 2010-09-06 01:56:30

1

您可以使用CROSS APPLY

DECLARE @MinPosts int = ##MinNumberOfPosts## 

SELECT 
    Id AS [User Link], 
    Reputation, 
    counts.[# Posts], 
    Reputation/counts.[# Posts] AS [Rep Per Post] 
FROM Users 
    CROSS APPLY (
    SELECT COUNT(*) 
    FROM posts 
    WHERE posts.OwnerUserId = Users.Id 
) counts([# Posts]) 
WHERE counts.[# Posts] > @MinPosts 
ORDER BY [Rep Per Post] DESC​ 
+0

謝謝。這正是我正在尋找的 – 2010-09-05 07:00:52

+0

我不認爲在這裏需要CROSS APPLY。 – ErikE 2010-09-05 07:16:24