hive sql inner join - как получить sum & row_num в том же запросе - PullRequest
0 голосов
/ 20 октября 2018

у меня есть 2 таблицы product & psales, данные в таблицах как показано ниже

select * from psales;
+-------------+---------------+--+
| psales.pid  | psales.sales  |
+-------------+---------------+--+
| 1           | 100           |
| 1           | 150           |
| 1           | 200           |
| 2           | 75            |
| 2           | 45            |
| 2           | 145           |
| 3           | 176           |
| 3           | 99            |
| 1           | 27            |
| 4           | 51            |
+-------------+---------------+--+

select * from product;
+--------------+----------------+--+
| product.pid  | product.pname  |
+--------------+----------------+--+
| 1            | p1             |
| 2            | p2             |
| 3            | p3             |
| 4            | p4             |
+--------------+----------------+--+

Цель состоит в том, чтобы получить продукт со 2-ыми самыми высокими объединенными продажами.

Вотзапрос, который я сейчас использую, чтобы получить продукт с наивысшими совокупными продажами (работает нормально)

select p1.pname, p1.total_sales
from (select p.pid as pid, p.pname as pname, s.sales as sales,  
      sum(s.sales) over (partition by p.pid order by p.pid) as total_sales 
      from product p
      inner join psales s on (p.pid = s.pid) 
      order by total_sales desc) p1 
limit 1;

Как мне получить продукт с 2-м по величине совокупными продажами?

Когда я пытаюсьполучить row_num во внутреннем запросе, это выдает ошибку, показанную ниже:

select p1.pname as pname, p1.total_sales as total_sales, row_num() over (partition by pname order by pname) as rownum 
from (select p.pid as pid, p.pname as pname, s.sales as sales,  
      sum(s.sales) over (partition by p.pid order by p.pid) as total_sales, 
      row_num() over (partition by p.pid) as rownum 
      from product p 
      inner join psales s on (p.pid = s.pid) 
      order by total_sales desc) p1 
where rownum =2;

Ошибка: ошибка при компиляции оператора: FAILED: SemanticException Не удалось разбить вызовы Windowing на группы.Как минимум 1 группа должна зависеть только от входных столбцов.Также проверьте наличие циклических зависимостей.Основная ошибка: Неверная функция row_num (состояние = 42000, код = 40000)

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы можете использовать dense_rank для ранжирования суммы за пид, комбинации имен.

select p1.pname,p1.pid,p1.total_sales
from (select p.pid, p.pname,sum(s.sales) as total_sales,
      dense_rank() over(order by sum(s.sales) desc) as rnk 
      from product p 
      join psales s on p.pid = s.pid
      group by p.pid,p.pname
     ) p1
where rnk=2
0 голосов
/ 20 октября 2018

Используйте функцию row_number() в верхнем подзапросе.И, похоже, вам не нужно аналитическое sum(), простое group by подойдет:

select p1.pname, p1.pid, p1.total_sales
  from
(
select p1.pname, p1.pid, p1.total_sales, 
       row_number() over (order by total_sales  desc) rn
  from 
     (select p.pid, p.pname, sum(s.sales) as total_sales 
        from product p 
             inner join psales s on p.pid = s.pid
        group by p.pid, p.pname
     )p1
)s
where rn=2
;

Используйте dense_rank() вместо row_number(), если вы хотите выбрать все продукты с одинаковыми продажами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...