SELECT prod_id,
SUM( SALES ) AS total_sales
FROM table_name
GROUP BY prod_id, TRUNC( "DATE", 'MM' )
ORDER BY total_sales DESC
FETCH FIRST ROW ONLY;
或:
SELECT PROD_ID,
total_sales
FROM (
SELECT prod_id,
SUM( SALES ) AS total_sales,
RANK() OVER ( ORDER BY SUM( SALES ) DESC ) AS rnk
FROM table_name
GROUP BY prod_id, TRUNC( "DATE", 'MM' )
)
WHERE rnk = 1
对于您的示例数据:
CREATE TABLE table_name ( PROD_ID, SALES, "DATE" ) AS
SELECT 1, 400, DATE '2020-04-20' FROM DUAL UNION ALL
SELECT 1, 300, DATE '2020-04-23' FROM DUAL UNION ALL
SELECT 2, 300, DATE '2020-05-23' FROM DUAL UNION ALL
SELECT 2, 300, DATE '2020-05-20' FROM DUAL;
select *
from (
select
prod_id,
trunc(sales_date, 'mm') sales_month,
sum(sales) total_sales,
lag(sum(sales)) over(partition by prod_id order by trunc(sales_date, 'mm')) lag_total_sales
from mytable
group by prod_id, trunc(sales_date, 'mm')
) t
where total_sales > lag_total_sales
子查询计算每个产品和每个月的总销售额,并使用 lag() 检索上个月的总销售额。然后,外部查询过滤每月销售额大于上月销售额的产品/月份元组。 您可能需要精确地定义如何处理产品的第一个销售月。上面的查询将过滤掉它(因为没有“上一个”月)。如果要将其保留在结果集中,可以更改 where 条款至:
where lag_total_sales is null or total_sales > lag_total_sales
2条答案
按热度按时间mm5n2pyu1#
按月份分组,然后找到第一行。
或:
对于您的示例数据:
两种输出:
db<>在这里摆弄
vatpfxk52#
我需要oraclequery来获取一个产品的销售额,只要它比上个月的销售额大
如果您的数据分布超过2个月,那么我建议使用聚合和
lag()
:子查询计算每个产品和每个月的总销售额,并使用
lag()
检索上个月的总销售额。然后,外部查询过滤每月销售额大于上月销售额的产品/月份元组。您可能需要精确地定义如何处理产品的第一个销售月。上面的查询将过滤掉它(因为没有“上一个”月)。如果要将其保留在结果集中,可以更改
where
条款至: