2014-04-25 6 views
0

SQL Server 2012에서 사용자 지정 집계를 만드는 방법은 무엇입니까? 중간 집계를 얻으려고합니다. 같은사용자 지정 집계 함수

뭔가 :

;with cte as 
(
    select top 50 percent val from tbl order by val desc 
) 
select top 1 from cte 

답변

2

당신은 내장 함수를 사용한다, percentile_cont() 또는 percentil_disc() (here 참조),이 기록의 짝수의 중간 값을 정의하는 방법에 따라 달라집니다.

나는 다음 당신이 원하는 것을 생각 :

select percentile_cont(0.5) within group (order by val) as median 
from tbl; 

이 자신의 기능을 정의하는 것보다 훨씬 쉽다.

1

이 문제에 대한 다양한 접근 방법을 검토하고 성능 분석을 제공하는 흥미로운 기사가 ​​있습니다. 이것이 가장 좋은 반면, PERCENTILE_CONT()가 최악의 수행이라고 주장 :

DECLARE @c BIGINT = (SELECT COUNT(*) FROM dbo.EvenRows); 

SELECT AVG(1.0 * val) 
FROM (
    SELECT val FROM dbo.EvenRows 
    ORDER BY val 
    OFFSET (@c - 1)/2 ROWS 
    FETCH NEXT 1 + (1 - @c % 2) ROWS ONLY 
) AS x; 

참조 : http://www.sqlperformance.com/2012/08/t-sql-queries/median

+0

내가 집계를 원하는 이유는 그룹의 그룹에서 사용할 수 있기 때문입니다. – Metaphor

0

여기에 그룹 질의에 宮本 武 蔵의 대답을 설정하는 미봉책 방법입니다. 나는 Microsoft의 Northwind..Orders 테이블을 사용하여 Freight 열의 중간 계산을 표시했습니다.

SELECT CustomerID, AVG(1.0 * x.Freight), CASE WHEN COUNT(*)%2=1 THEN COUNT(*) ELSE COUNT(*)/2 END AS Cnt 
FROM Orders as O1 
CROSS APPLY (
    SELECT Freight FROM Orders as O2 
    WHERE O2.CustomerID = O1.CustomerID 
    ORDER BY Freight 
    OFFSET (SELECT COUNT(*)-1 FROM Orders as O2 WHERE O2.CustomerID = O1.CustomerID)/2 ROWS 
    FETCH NEXT 1 + (1 - (SELECT COUNT(*) FROM Orders as O2 WHERE O2.CustomerID = O1.CustomerID) % 2) ROWS ONLY 
) AS x 
GROUP BY CustomerID 

그룹 쿼리에 추가 집계가 필요할 수도 있고 필요하지 않을 수도 있으며 COUNT (*)를 얻는 방법을 보여 줬습니다. CROSS APPLY 연산은 CustomerID 당 한 행을 홀수 개 주문으로 생성하고 CustomerID 당 두 행을 짝수 개의 주문으로 생성하므로 COUNT (*) 값을 얻으려면 COUNT (*)를 나눠야합니다 CROSS APPLY가 2이면 짝수이고, 홀수이면 그대로 두십시오.

이 정보가 도움이되는지 확실하지 않은 경우 신중하게 조사해야 정확한 정보를 얻을 수 있지만 유용한 정보 일 수 있습니다.