SQL:值高于值的百分比

时间:2015-10-28 14:46:05

标签: mysql sql

我希望计算一个值,该值高于每个组的值的百分比。

假设我有:

CREATE TABLE project
(
    id int,
    event int, 
    val int
);

INSERT INTO project(id,event,val) 
VALUES
    (1, 11, 43), 
    (1, 12, 19), 
    (1, 13, 19),
    (1, 14, 53),
    (1, 15, 45),
    (1, 16, 35),
    (2, 21, 22),
    (2, 22, 30),
    (2, 23, 25),
    (2, 24, 28);

我现在想要为每个id计算什么是val,例如高于5%,或该id的val的30%。

例如,对于id = 1,我们有以下值:43,19,19,53,45,35。 应变表就像这样:

19 35 43 45 53 
 2  1  1  1  1 

并且val = 20(高于19)将被选择为高于行的5%(实际为6个中的6个)。

id 2的竞争表是:

22 25 28 30
 1  1  1  1

我的预期是:

id  val_5p_coverage  val_50p_coverage
1   20               36
2   23               26

val_5p_coverage是id值必须高于val的至少5%的值。

val_50p_coverage是id值必须高于val的至少50%的值。

如何用SQL计算?

1 个答案:

答案 0 :(得分:0)

我设法在 HiveQL (对于Hadoop)中执行此操作,如下所示:

create table prep as
    select *,
            CUME_DIST() OVER(PARTITION BY id ORDER BY val ASC) as proportion_val_equal_or_lower
    from project

SELECT id,
       MIN(IF(proportion_val_equal_or_lower>=0.05, val, NULL)) AS val_5p_coverage,
       MIN(IF(proportion_val_equal_or_lower>=0.50, val, NULL)) AS val_50p_coverage
FROM prep
GROUP BY id

虽然这不是MySQL或SQL本身,但它可能有助于在MySQL或SQL中执行它。