gpt4 book ai didi

sql - 在 GROUP BY 中使用自定义聚合函数?

转载 作者:行者123 更新时间:2023-12-04 06:11:46 25 4
gpt4 key购买 nike

我有一个简单的 MEDIAN 计算函数:

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

id 列上使用 GROUP BY 在此表上调用 MEDIAN 函数的最佳方法是什么?所以,我正在寻找这样的东西:

SELECT id, COMPUTEMEDIAN(Values)
FROM #TEMP
GROUP BY id

我目前的方法是使用 XMLPATHGROUP BY 操作产生的所有值组合成一个大字符串,然后将其传递给函数,但这涉及字符串拆分操作和大字符串这只会减慢一切。有什么建议吗?

最佳答案

由于您使用的是 SQL Server 2008,我建议将聚合函数编写为 CLR 函数。

http://msdn.microsoft.com/en-us/library/91e6taax(v=vs.80).aspx

另外,以前也有人问过这个问题。也许他们的回答会有所帮助

Function to Calculate Median in Sql Server

关于sql - 在 GROUP BY 中使用自定义聚合函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7692698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com