HAVING子句中的Windows替代功能

问题描述 投票:0回答:2

我正在尝试获得每个产品的最早处理日期,如下所示:

select prod_id, prod_name, prod_date, min(prod_date) over (partition by prod_id) as min_prod_date
from dim_product
where prod_name in ('xxx', 'yyy', 'zzz')
having prod_date = min_prod_date

这给了我错误:

ORA-00904:“ min_prod_date”:无效的标识符

所以我试图在具有给我错误的having子句中使用min()函数:

ORA-30483:此处不允许使用窗口功能

作为替代,我这样修改了我的查询:

with temp as(
select prod_id, prod_name, prod_date, min(prod_date) over (partition by prod_id) as min_prod_date
    from dim_product
    where prod_name in ('xxx', 'yyy', 'zzz')
    having prod_date = min_prod_date))
select * from temp where prod_date = min_prod_date

这是正确的处理方式还是其他有效的方法?

sql oracle subquery greatest-n-per-group having-clause
2个回答
0
投票
一种方法在子查询中使用rank()

select * from ( select prod_id, prod_name, prod_date, rank() over(partition by prod_id order by prod_date) rn from dim_product where prod_name in ('xxx', 'yyy', 'zzz') ) t where rn = 1

作为替代,您可能还需要考虑使用相关子查询进行过滤:

select prod_id, prod_id, prod_date from dim_product d where d.prod_name in ('xxx', 'yyy', 'zzz') and d.prod_date = ( select min(d1.prod_date) from dim_product d1 where d1.prod_id = d.prod_id and d1.prod_name in ('xxx', 'yyy', 'zzz') )

为了提高后一个查询的效率,您需要在(prod_name, prod_id, prod_date)上建立索引。

0
投票
这听起来像聚合:

select prod_name, min(prod_date) from dim_product where prod_name in ('xxx', 'yyy', 'zzz') group by prod_name;

© www.soinside.com 2019 - 2024. All rights reserved.