你可以试试下面的
SELECT
"Org_ID",
"Product_ID",
CONCAT(
CONCAT(Order_Month_Group,' to '),
TO_CHAR(MAX(actual_date),'MON-YYYY')
) as Order_Month,
"Amount"
FROM (
SELECT
t1.*,
LAG(
"Order_Month",
CASE WHEN continued=0 THEN 0 ELSE seq_num-1 END
,"Order_Month") OVER (
PARTITION BY "Org_ID","Product_ID","Amount"
ORDER BY actual_date
) as Order_Month_Group
FROM (
SELECT
t.*,
TO_DATE(t."Order_Month",'MON-YYYY') as actual_date,
ROW_NUMBER() OVER (
PARTITION BY t."Org_ID",t."Product_ID",t."Amount"
ORDER BY TO_DATE("Order_Month",'MON-YYYY')
) as seq_num,
CASE
WHEN t."Amount" = LAG(t."Amount",1,t."Amount") OVER (
PARTITION BY t."Org_ID",t."Product_ID"
ORDER BY TO_DATE("Order_Month",'MON-YYYY')
) THEN 1
ELSE 0
END as continued
FROM
my_oracle_table t
) t1
) t2
GROUP BY "Org_ID", "Product_ID", Order_Month_Group, "Amount"
ORDER BY MIN(actual_date)
或
SELECT
"Org_ID",
"Product_ID",
CONCAT(
CONCAT(TO_CHAR(MIN(actual_date),'MON-YYYY'),' to '),
TO_CHAR(MAX(actual_date),'MON-YYYY')
) as Order_Month,
"Amount"
FROM (
SELECT
t1.*,
SUM(continued) OVER ( ORDER BY actual_date) as grp
FROM (
SELECT
t.*,
TO_DATE("Order_Month",'MON-YYYY') as actual_date,
CASE
WHEN t."Amount" = LAG(t."Amount",1,t."Amount") OVER (
PARTITION BY t."Org_ID",t."Product_ID"
ORDER BY TO_DATE("Order_Month",'MON-YYYY')
) THEN 0
ELSE 1
END as continued
FROM
my_oracle_table t
) t1
) t2
GROUP BY "Org_ID", "Product_ID", grp, "Amount"
ORDER BY MIN(actual_date)
View Demo on DB Fiddle
让我知道这是否适合你。