Улей: найдите 20% лучших записей - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть некоторые данные, такие как: -

ID  PRICE
1   100
2   200
3   120
4   130
5   320
6   300
7   200
8   100
9   120
10  250

Мне нужно найти 20% лучших цен.

Ожидаемый результат: -

ID  PRICE
5   320
6   300

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Вы можете сделать это без объединений.Используйте аналитическую функцию для вычисления max(price), возьмите 80%, затем используйте цену фильтра> 80%:

with your_data as ( --this is your data
select stack(10,
1 ,  100,
2 ,  200,
3 ,  120,
4 ,  130,
5 ,  320,
6 ,  300,
7 ,  200,
8 ,  100,
9 ,  120,
10,  250) as (ID,  PRICE)
)

select id, price 
from
(
select d.*, max(price) over()*0.8 as pct_80 from your_data d
)s where price>pct_80

Результат:

OK
id      price
6       300
5       320

Используйте вашу таблицу вместо WITH подзапросадобавьте заказ на ID , если необходимо.

0 голосов
/ 24 апреля 2019

Вот способ, которым вы можете сделать это без необходимости использовать join.

Select id,price from (select id,price, row_number() over(order by price desc) r1,count(*) over()*(20/100) ct from table_name)final where r1<=ct ;
0 голосов
/ 11 февраля 2019

Ниже будут запросы -

with top_20 as (
  select 
    max(price)*0.8 as price1 
  from 
    <tableName>
)
select * from <tableName> t1 , top_20 t2 where t1.price > t2.price1;

select 
 name, 
 price 
from 
 (select 
    name, 
    price, 
    max(price)*0.8 over (order by price) as top_20 
 from <tableName>
 ) t1 
where 
 t1.price > t1.top_20;

Ниже запрос не будет работать в кусте -

select * from <tableName> where price > (select max(salary)*0.8 from <tableName>)

select * from <tableName> t1 where exists (select salary from <tablename> t2 where t1.salary > t2.salary*0.8)

Причина - Hive не поддерживает подзапрос в предложении where с равным условием,он поддерживает только IN, NOT IN, EXISTS и NOT EXISTS.

Даже с Exists и NOT Exists, он поддерживает только Equijoin, для получения более подробной информации см. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries#LanguageManualSubQueries-SubqueriesintheWHEREClause

Надеюсь, этопомогает.

...