|
用JOIN时免不了要使用集计涵数, 思路大致如下, 首先, 使用月份常数表和TEST做笛卡尔集,
SELECT TO_DATE(‘2004/’& MONTH.MM & ‘/01’) YM_ALL, YM, CUSTOM
FROM MONTH, TEST
WHERE to_date(‘2004/’& MONTH.MM & ‘01’)<= getdate()
AND TEST.YM <=TO_DATE(‘2004/’& MONTH.MM & ‘/01’)
结果集中所有比月份表中的月份小在库记录, 都会和月份生成一条记录, 按照要求, 只有和当前月最接近的一条可以留下, 因此使用集计涵数求出, 各月分的最近月份记录
SELECT YM_ALL, MAX(YM) MAX_YM, CUSTOM
FROM (SELECT TO_DATE(‘2004/’& MONTH.MM & ‘/01’) YM_ALL, YM
FROM MONTH, TEST
WHERE to_date(‘2004/’& MONTH.MM & ‘01’)<= getdate()
AND TEST.YM <=TO_DATE(‘2004/’& MONTH.MM & ‘/01’)) T1
GROUP BY YM_ALL, CUSTOM
最后, 再和TEST结合一次取得在库
SELECT T2.YM_ALL, T2.CUSTOM, TEST.INV
FROM TEST,
SELECT YM_ALL, MAX(YM) MAX_YM, CUSTOM
FROM (SELECT TO_DATE(‘2004/’& MONTH.MM & ‘/01’) YM_ALL, YM
FROM MONTH, TEST
WHERE to_date(‘2004/’& MONTH.MM & ‘01’)<= getdate()
AND TEST.YM <=TO_DATE(‘2004/’& MONTH.MM & ‘/01’)) T1
GROUP BY YM_ALL, CUSTOM) T2
WHERE T2.CUSTOM=TEST.CUSTOM
AND T2.MAX_YM=TEST.YM
可以看到, 上述SQL文仍然需要对集计涵数进行优化, 且由于中间检索很多, 调试比较复杂, 并不是很直接的做法 |
|