我正在尝试获得每个产品的最早处理日期,如下所示:
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
这是正确的处理方式还是其他有效的方法?
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)
上建立索引。
select prod_name, min(prod_date)
from dim_product
where prod_name in ('xxx', 'yyy', 'zzz')
group by prod_name;