示例:
PROD_ID SALES DATE
1 400 12-APR-2020
1 300 20-apr-2020
2 300 23-MAY-2020
2 300 20-may-2020
结果应该是
1 700
prod id
应该在 5 月和 4 月的销售之间进行比较,并显示两个月之间的最大值。
按月分组,然后找到第一行。
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;
两个输出:
PROD_ID |TOTAL_SALES ------: |----------: 1 | 700
db<>在这里小提琴
我需要 Oracle 查询来获取仅当产品大于上个月的产品销售额时
如果你的数据分布超过2个月,那么我建议聚合和lag()
:
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