2015-10-28 3 views
0

Я хочу рассчитать значение, которое превышает процент от совокупности значений, по каждой группе.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); 

Теперь я хочу, чтобы вычислить для каждого идентификатора, что является вал, который будет, например, выше, чем 5%, или 30% от Валу для этого идентификатора.

Например, для ид = 1, мы имеем следующие значения: 43, 19, 19, 53, 45, 35. Таким образом, таблица сопряженности будет выглядеть следующим образом:

19 35 43 45 53 
2 1 1 1 1 

и Вэл = 20 (выше 19) будет выбрано выше 5% (актуал 2 из 6) строк.

contengency таблица для идентификатором 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 это значение, вал должен был быть выше, по меньшей мере, 5% Валу в ид.

val_50p_coverage - значение val, которое должно быть не менее 50% от значения val.

Как я могу рассчитать это с помощью SQL?

+0

Поместите свой вопрос в базу данных, которую вы используете. –

+1

Причина, по которой нет ответа, заключается в том, что не ясно, что вы пытаетесь сделать (некоторые ожидаемые результаты будут хорошими) и то, что вы пробовали, что не удалось. Это не «бесплатный консультант, чтобы написать его для вас». – Hogan

ответ

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.