나는 간단한 MEDIAN 계산 기능이 있습니다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
는하지만, 내 표는 다음과 같은 형식으로되어 있습니다 GROUP BY
를 사용하여이 테이블에 MEDIAN
함수를 호출하는 가장 좋은 방법은 무엇
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
열에? 그래서, 나는 이런 식으로 뭔가를 찾고 있어요 :
SELECT id, COMPUTEMEDIAN(Values)
FROM #TEMP
GROUP BY id
내 현재의 접근 방식은 함수에 전달 후 큰 문자열로 GROUP BY
조작으로 인한 모든 값을 결합 XMLPATH
을 사용하는 것입니다 그러나 이것은 문자열 분할 작업을 포함한다 큰 문자열의 경우 이것은 모든 것을 느리게 만듭니다. 어떤 제안?
예. 나는 그것을 보았지만 특별한 특권이 필요하지 않은가? 매우 제한된 환경에서이 스크립트를 실행하므로 CLR이 나를위한 옵션인지 확실하지 않습니다. – Legend
올바른, CLR 함수를로드 할 수있는 데 필요한 특수 사용 권한이 있습니다 : "CREATE AGGREGATE 권한이 필요하며 EXTERNAL NAME 절에 지정된 어셈블리에 대한 REFERENCES 권한이 필요합니다." http://msdn.microsoft.com/en-us/library/ms182741.aspx –
예. 그것은 내 관심사였다. 하지만 +1 시간. 고맙습니다. – Legend