0

我有一个带有float值的表。我想使用这些值的子集 (A) 来使用PERCENT_RANK(). 然后,我想根据从第一个子集 (A) 派生的排名,将排名分配给表中值的第二个(非相交)子集 (B)。简单地将 (B) 中的值连接到 (A) 中的值是行不通的,因为子集 (B) 中的值通常不等于子集 (A) 中的值。在这种情况下,我可以使用“最接近值”方法或“线性插值”方法来获得排名。我更喜欢速度和简单,因为我要处理数十万行。

这是一个具体的例子(假设子集 A 是 Fl​​ag = 0 并且子集 B 是 Fl​​ag = 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
4

1 回答 1

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;
于 2016-11-20T01:10:27.473 回答