SQL Server 2012에서 사용자 지정 집계를 만드는 방법은 무엇입니까? 중간 집계를 얻으려고합니다. 같은사용자 지정 집계 함수
뭔가 :
;with cte as
(
select top 50 percent val from tbl order by val desc
)
select top 1 from cte
SQL Server 2012에서 사용자 지정 집계를 만드는 방법은 무엇입니까? 중간 집계를 얻으려고합니다. 같은사용자 지정 집계 함수
뭔가 :
;with cte as
(
select top 50 percent val from tbl order by val desc
)
select top 1 from cte
당신은 내장 함수를 사용한다, percentile_cont()
또는 percentil_disc()
(here 참조),이 기록의 짝수의 중간 값을 정의하는 방법에 따라 달라집니다.
나는 다음 당신이 원하는 것을 생각 :
select percentile_cont(0.5) within group (order by val) as median
from tbl;
이 자신의 기능을 정의하는 것보다 훨씬 쉽다.
당신은 다음 문서를 참조 할 수 있습니다.
이 문제에 대한 다양한 접근 방법을 검토하고 성능 분석을 제공하는 흥미로운 기사가 있습니다. 이것이 가장 좋은 반면, 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
여기에 그룹 질의에 宮本 武 蔵의 대답을 설정하는 미봉책 방법입니다. 나는 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이면 짝수이고, 홀수이면 그대로 두십시오.
이 정보가 도움이되는지 확실하지 않은 경우 신중하게 조사해야 정확한 정보를 얻을 수 있지만 유용한 정보 일 수 있습니다.
내가 집계를 원하는 이유는 그룹의 그룹에서 사용할 수 있기 때문입니다. – Metaphor