2016-11-20 7 views
0

테이블에 float 값이 있습니다. 그 값 중 서브 세트 (A)를 사용하여 PERCENT_RANK()을 사용하여 순위를 만들고 싶습니다. 그런 다음 첫 번째 하위 집합 (A)에서 파생 된 순위에 따라 테이블의 값 중 두 번째 (교차하지 않는) 하위 집합 (B)에 순위를 지정하려고합니다. 일반적으로 부분 집합 (B)의 값은 부분 집합 (A)의 값과 같지 않으므로 (B)의 값과 (A)의 값을 결합하면 작동하지 않습니다. 이 경우, "가장 가까운 값"접근법 또는 "선형 보간"접근법을 사용하여 순위를 얻는 것이 좋습니다. 내가 수십만 개의 행을 다루고 있기 때문에 나의 선호는 속도와 단순성이다.SQL에서 다른 데이터 세트를 사용하여 데이터 세트의 순위를 매기는 방법은 무엇입니까?

여기 (플래그 = 0, 서브 세트 B이고 서브 세트 A를 추정이다 플래그 = 1) 구체 예이다

DECLARE @Data TABLE 
(
    Value FLOAT, 
    Flag BIT 
) 
INSERT INTO @Data SELECT 0.081, 0 
INSERT INTO @Data SELECT 0.831, 0 
INSERT INTO @Data SELECT 0.798, 0 
INSERT INTO @Data SELECT 0.722, 0 
INSERT INTO @Data SELECT 0.322, 0 
INSERT INTO @Data SELECT 0.186, 0 
INSERT INTO @Data SELECT 0.494, 0 
INSERT INTO @Data SELECT 0.757, 0 
INSERT INTO @Data SELECT 0.996, 0 
INSERT INTO @Data SELECT 0.146, 0 
INSERT INTO @Data SELECT 0.514, 1 
INSERT INTO @Data SELECT 0.787, 1 
INSERT INTO @Data SELECT 0.125, 1 
INSERT INTO @Data SELECT 0.324, 1 
INSERT INTO @Data SELECT 0.86, 1 
--Subset A 
SELECT *, 
    Rnk = PERCENT_RANK() OVER (ORDER BY Value) 
FROM @Data 
WHERE Flag = 0 
--Subset B 
SELECT *, 
    Rnk = ?--Ranking based on ranks derived from subset A 
FROM @Data 
WHERE Flag = 1 
+0

이 [링크] (http://sqlmag.com/t-sql/last-non-null-puzzle) 매우 빠른 솔루션에 무리를 저를 도와 결국이 하나의 방법입니다. – Joe

답변

1

흠. . .

with a as (
     select d.* 
      PERCENT_RANK() OVER (ORDER BY Value) as rnk 
     from @Data d 
     where Flag = 0 
    ) 
select b.*, a.rnk 
from @Data b outer join 
    (select top 1 * 
     from a 
     where a.value <= b.value 
     order by a.value desc 
    ) a 
where Flag = 1; 
관련 문제