HiveQL: выберите значение столбца в паре с Max (значением) другого столбца - PullRequest
0 голосов
/ 17 мая 2018

Предположим, у меня есть эта таблица

Date         Department   Value
2017-01-02    A            30
2017-01-02    B            60
2017-01-02    C            10
2017-01-02    D            40
2017-01-03    C            20
2017-01-03    D            150
2017-01-03    E            100
2017-01-03    F            20
...

И я хочу получить отдел, который имеет более высокую «ценность» каждый день

Что приведет к

Date          Department   Value
2017-01-02    B            60
2017-01-03    D            150

Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Ваши базовые данные:

hive> create table tx1(date1 date,department string,value int) row format delimited fields terminated by ',';
OK
Time taken: 1.172 seconds
hive> load data local inpath '/home/vivekanand/vivek/hive/test.dat' into table tx1;
Loading data to table default.tx1
OK
Time taken: 0.727 seconds
hive> select * from tx1;
OK
2017-01-02  A   30
2017-01-02  B   60
2017-01-02  C   10
2017-01-02  D   40
2017-01-03  C   20
2017-01-03  D   150
2017-01-03  E   100
2017-01-03  F   20
Time taken: 1.89 seconds, Fetched: 8 row(s)

Вы можете использовать аналитическую функцию здесь, как показано ниже:

select date1,department,value
from(select date1,department,value,rank() over(partition by date1 order by value desc) f from tx1) k
where f=1;

Выход:

Total MapReduce CPU Time Spent: 0 msec
OK
2017-01-02  B   60
2017-01-03  D   150
Time taken: 1.569 seconds, Fetched: 2 row(s)
0 голосов
/ 17 мая 2018

Использовать rank() аналитическую функцию.rank() назначит 1 для строк с более высоким значением в день.

select Date, Department, Value
from
(
select a.Date, a.Department, a.Value,
       rank() over(partition by a.Date order by a.Value desc) as rnk
  from tableName a
)s
where rnk=1
;
0 голосов
/ 17 мая 2018

Разбейте задачу на две части. Сначала получите максимальное значение по дате, т.е. CTE .

Соедините набор результатов с базовой таблицей и получите желаемый результат

, т. Е.

  with  temp as (
          select Date ,max(value) as value
          from tableName group by Date
  )
  selct a.Date  ,  a.Department ,a.Value 
      from tableName a join temp b
      on a.Date=b.Date 
      and a.value=b.value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...