hive sql排名与关系

jtoj6r0c  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(467)

如何在配置单元sql中重新编写below查询我在oraclesql中尝试了below查询,它可以工作,但是需要在配置单元ql中编写相同的查询

select * from sales order by unit_price fetch with ties
dfddblmv

dfddblmv1#

这是相当棘手的复制窗口函数。 fetch with ties 返回第n行,然后返回具有相同值的所有行。因此,一种方法是:

select s.*
from sales *
where s.unit_price <= (select s2.unit_price
                       from sales s2
                       order by unit_price 
                       limit 4, 1
                      );

这并不准确,因为如果行数少于5行,它就不起作用。另一种使用窗口函数的方法更易于修复:

select s.*
from (select s.*,
             max(case when seqnum = 5 then unit_price end) over () as unit_price_5
      from (select s.*,
                   row_number() over (order by unit_price) as seqnum
            from s
           ) s
     ) s
where unit_price <= unit_price_5 or
      unit_price_5 is null;

请注意,没有任何内置窗口函数可以处理这种情况。例如,如果价格是:

1
1
1
1
1
1
2

那么 row_number() 只返回前5个 1 s。 dense_rank() 以及 rank() 将返回所有行。

hkmswyz6

hkmswyz62#

甲骨文订货人。。fetch next n rows with tires用于将返回的前n(order by)行数限制为next(first)指定的行数。而with tires意味着如果某些行具有相同的order by值,那么除了指定的行数之外,还将返回它们。
配置单元没有获取功能。有限制,这不支持与轮胎。
您可以使用函数u rank()和where filter实现类似的功能。例如,我们需要以最低的价格获得5笔销售,如果有相同价格的销售,也要退货。密集的排名将分配相同的排名,以相同的价格行。

select * 
from
(
    select s.*, 
           dense_rank() over(order by unit_price) rnk --lowest unit_price first
                                                      --to get highest price, use order by unit_price DESC
     from sales s 
) 
where rnk<=5  --If there are rows with the same rank, they all will be returned
order by rnk

相关问题