SQL Fiddle
Oracle 11g R2 架构设置:
CREATE TABLE FORECAST ( ITEM, FORECAST_WEEK_DATE, FORECAST) AS
SELECT 1, DATE '2015-01-01', 1 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '7' DAY, 2 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '14' DAY, 3 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '21' DAY, 4 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '28' DAY, 5 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '35' DAY, 6 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '42' DAY, 7 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01', 3 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '7' DAY, 1 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '14' DAY, 5 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '21' DAY, 8 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '28' DAY, 3 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '35' DAY, 2 FROM DUAL;
CREATE TABLE SALES (ITEM, SALES_WEEK_DATE, SALES) AS
SELECT 1, DATE '2015-01-01', 3 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '7' DAY, 2 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '14' DAY, 1 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '21' DAY, 5 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '28' DAY, 3 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '35' DAY, 8 FROM DUAL
UNION ALL SELECT 1, DATE '2015-01-01' + INTERVAL '42' DAY, 11 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01', 7 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '7' DAY, 1 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '14' DAY, 4 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '21' DAY, 3 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '28' DAY, 6 FROM DUAL
UNION ALL SELECT 2, DATE '2015-01-01' + INTERVAL '35' DAY, 8 FROM DUAL;
查询 1:
这将在表格中为每个项目获取最近 4 周的数据:
WITH ordered_week_data AS (
SELECT f.ITEM,
ROW_NUMBER() OVER ( PARTITION BY f.ITEM ORDER BY FORECAST_WEEK_DATE DESC ) AS RN,
f.FORECAST_WEEK_DATE AS WEEK_DATE,
FORECAST,
SALES
FROM FORECAST f
INNER JOIN
SALES s
ON ( f.ITEM = s.ITEM AND f.FORECAST_WEEK_DATE = s.SALES_WEEK_DATE )
)
SELECT ITEM,
MAX( WEEK_DATE ) AS LAST_WEEK_DATE,
SUM( FORECAST ) AS FORECAST_TOTAL,
SUM( SALES ) AS SALES_TOTAL
FROM ordered_week_data
WHERE RN <= 4
GROUP BY
ITEM
Results:
| ITEM | LAST_WEEK_DATE | FORECAST_TOTAL | SALES_TOTAL |
|------|----------------------------|----------------|-------------|
| 1 | February, 12 2015 00:00:00 | 22 | 27 |
| 2 | February, 05 2015 00:00:00 | 18 | 21 |