我有一个简单的中值计算功能:在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