Улей Суммирование данных в таблице на основе диапазона дат - PullRequest
1 голос
/ 17 мая 2019

Иметь таблицу со следующим дизайном схемы и данными, находящимися внутри нее, как:

ID HITS MISS DDATE
1 10    3    20180101
1 33    21   20180122
1 84    11   20180901
1 11    2    20180405
1 54    23   20190203
1 33    43   20190102
4 54    22   20170305
4 56    88   20180115
5 87    22   20180809
5 66    48   20180617
5 91    53   20170606

DataTypes:

ID    INT
HITS  INT 
MISS  INT
DDATE STRING

Требуется рассчитать суммуданные (HITS и MISS) на ежегодной основе, т.е. 2017, 2018, 2019 ...

. Написано следующий запрос:

SELECT ID,
SUM(HITS) AS HITS,SUM(MISS) AS MISS,
CASE 
    WHEN DDATE BETWEEN '201701' AND '201712' THEN '2017' ELSE 
    'NOTHING' END AS TTL_YR17_DATA
CASE 
    WHEN DDATE BETWEEN '201801' AND '201812' THEN '2018' ELSE 
    'NOTHING' END AS TTL_YR18_DATA
CASE 
    WHEN DDATE BETWEEN '201901' AND '201912' THEN '2019' ELSE 
    'NOTHING' END AS TTL_YR19_DATA
FROM 
     HST_TABLE
WHERE 
     DDATE BETWEEN '201801' AND '201812'
GROUP BY 
     ID,DDATE; 

Но,запрос не получает ожидаемый результат.

Actual O/P:

1 10   3    2018
1 33   21   2018
1 84   11   2018
1 11   2    2018
1 54   23   2019
1 33   43   2019
4 54   22   2017
4 56   88   2018
5 87   22   2018
5 66   48   2018
5 91   53   2017

Expected O/P:

1   138 37  2018
4   56  88  2018
5   153 70  2018
1   87  66  2019
5   91  53  2017

Another related question:

Есть ликаким образом я могу избежать передачи диапазона DDATE в запросе?Поскольку это должно быть предоставлено пользователем и не должно быть жестко закодировано.

Любая помощь / совет для достижения вышеупомянутых двух требований будет действительно полезна.

Ответы [ 2 ]

3 голосов
/ 17 мая 2019

ОК, это легко реализовать с помощью функции substring в HIVE, как показано ниже:

select
    substring(dddate,0,4) as the_year,
    id,
    sum(hits) as hits_num,
    sum(miss) as miss_num
from
    hst_table
group by
    substring(dddate,0,4),
    id
order by
    the_year,
    id
1 голос
/ 18 мая 2019

Ответ выше @ Shawn.X правильный, но имеет логический недостаток. Ниже исправлено:

select
    substring(ddate,0,4) as the_year,
    id,
    sum(hits) as hits_num,
    sum(miss) as miss_num
from
    hst_table
group by
    substring(ddate,0,4),
    id
order by
    the_year,
    id;
...