我有一個簡單的中值計算功能:在GROUP BY中使用自定義聚合函數?
IF OBJECT_ID(N'COMPUTEMEDIAN', N'FN') IS NOT NULL
DROP FUNCTION dbo.COMPUTEMEDIAN;
GO
CREATE FUNCTION dbo.COMPUTEMEDIAN(@VALUES NVARCHAR(MAX))
RETURNS DECIMAL
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX)
DECLARE @MEDIAN DECIMAL
SET @MEDIAN = 0.0;
DECLARE @MEDIAN_TEMP TABLE (RawValue DECIMAL);
-- This is the Killer!
INSERT INTO @MEDIAN_TEMP
SELECT s FROM master.dbo.Split(',', @VALUES) OPTION(MAXRECURSION 0)
SELECT @MEDIAN =
(
(SELECT MAX(RawValue) FROM
(SELECT TOP 50 PERCENT RawValue FROM @MEDIAN_TEMP ORDER BY RawValue) AS BottomHalf)
+
(SELECT MIN(RawValue) FROM
(SELECT TOP 50 PERCENT RawValue FROM @MEDIAN_TEMP ORDER BY RawValue DESC) AS TopHalf)
)/2
--PRINT @SQL
RETURN @MEDIAN;
END;
GO
然而,我的表是以下形式:
CREATE TABLE #TEMP (GroupName VARCHAR(MAX), Value DECIMAL)
INSERT INTO #TEMP VALUES ('A', 1.0)
INSERT INTO #TEMP VALUES ('A', 2.0)
INSERT INTO #TEMP VALUES ('A', 3.0)
INSERT INTO #TEMP VALUES ('A', 4.0)
INSERT INTO #TEMP VALUES ('B', 10.0)
INSERT INTO #TEMP VALUES ('B', 11.0)
INSERT INTO #TEMP VALUES ('B', 12.0)
SELECT * FROM #TEMP
DROP TABLE #TEMP
什麼是使用GROUP BY
來調用這個表MEDIAN
功能的最佳途徑在id
列?所以,我期待這樣的事情:
SELECT id, COMPUTEMEDIAN(Values)
FROM #TEMP
GROUP BY id
我目前的做法包括使用XMLPATH
從GROUP BY
操作導致成一個大的字符串,然後將它傳遞給函數的所有值組合,但是這涉及到字符串分割操作對於大字符串,這隻會減慢一切。有什麼建議麼?
是的。我看到了,但並不需要特殊的權限?我將在高度受限的環境中執行此腳本,因此我不確定CLR是否適合我。 – Legend
正確,需要特殊權限才能加載CLR函數: 「需要CREATE AGGREGATE權限以及EXTERNAL NAME子句中指定的程序集的REFERENCES權限。」 http://msdn.microsoft.com/en-us/library/ms182741.aspx –
是的。這是我的擔憂。但爲你的時間+1。謝謝。 – Legend