我正在尝试获取每个产品的最早处理日期,如下所示:
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": invalid identifier
所以我尝试在having子句中使用min()函数,这给了我错误:
ORA-30483: window functions are not allowed here
作为替代方案,我修改了我的查询,如下所示:
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
这是正确的做事方式还是有其他有效的方法?
最佳答案
一种方法在子查询中使用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)
上建立索引。
关于sql - HAVING 子句中的 WINDOW 函数替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60290402/