Window-Functions
OVER
子句中的 ORDER BY
和 PARTITION BY
參數有什麼區別?
下面的這些查詢都給了我完全相同的結果,我認為這是因為我的數據集而不是參數的工作方式。
使用子句時,和
OVER
之間有什麼區別。ORDER BY``PARTITION BY
稍有不同的是,為什麼不使用該術語
GROUP BY
而不是聽起來更複雜的PARTITION BY
,因為在這種情況下使用分區似乎可以實現與分組相同的效果。我知道您可以更改這些內部分區,然後這些更改會反映在表中。是這個原因嗎?查詢一:
SELECT CP.iYear, AVG(AVG(CP.mUpgradeCost)) OVER(ORDER BY iYear) AS [avg] FROM ProForma.dbo.CapitalProject CP GROUP BY CP.iYear
查詢 2:
SELECT CP.iYear, AVG(AVG(CP.mUpgradeCost)) OVER(PARTITION BY iYear) AS [avg] FROM ProForma.dbo.CapitalProject CP GROUP BY CP.iYear
該
PARTITION BY
作品作為一個“視窗組”,ORDER BY
並在組內進行排序。但是,因為您使用的是 ,所以您GROUP BY CP.iYear
有效地將視窗減少到僅一行(在視窗函式之前GROUP BY
執行)。在您的情況下,單行的平均值將是該行的值。AVG(CP.mUpgradeCost)
至於查詢 2,您是要創建執行平均值還是什麼?甚至不確定您希望該查詢返回什麼。
如果您刪除
GROUP BY CP.iYear
並更改AVG(AVG(...))
為 justAVG()
,您會看到不同之處。這是一個範例,有望解釋
PARTITION BY
和/或的用法ORDER BY
:隨機表:
a b ----- ------ X 1001 X 1002 X 1003 Y 1001 Y 1002
現在,
SELECT a, b, COUNT(*) OVER (PARTITION BY a) FROM r;
將返回
a b ----- ------ ------ X 1001 3 X 1002 3 X 1003 3 Y 1001 2 Y 1002 2
所以你可以看到有 3 行 a=X 和 2 行 a=Y。當您想要一個有序的視窗函式時,該
ORDER BY
子句就會發揮作用,例如行號或執行總計。SELECT a, b, ROW_NUMBER() OVER (PARTITION BY a ORDER BY b), SUM(b) OVER (PARTITION BY a ORDER BY b ROWS UNBOUNDED PRECEDING) FROM r;
… 給你:
a b ----- ------ ------ ------ X 1001 1 1001 X 1002 2 2003 X 1003 3 3006 Y 1001 1 1001 <- row number and running total resets here; new partition Y 1002 2 2003