我有一个月度表(仅包含每月第一天的行,并且每个只有一个的唯一约束)和每天具有相似信息的每日表(相同的交易,每天只有一个):

Monthly table       Daily table
-------------       -----------
2009-01-01          2009-01-01
2009-02-01          2009-01-02
: :                 : :
2009-09-01          2009-01-31
                    2009-02-01
                    : :
                    2009-02-28
                    2009-03-01
                    : :
                    2009-09-01

但可能有几天不见了。

我想运行一个查询,为每月表中的每个日期返回该日期以及每日表中该月份的最小和最大日期(如果绝对必要,使用标准SQL,特别是DB2特定的日期)。

因此,如果缺少1月的最后一周和2月的第一周,我需要:

MonthStart  FirstDay    LastDay
----------  ----------  ----------
2009-01-01  2009-01-01  2009-01-24
2009-02-01  2009-02-08  2009-02-28
: :
2009-09-01  2009-09-01  2009-01-30

这是我的查询:

select m.date as m1,               
       dx.d1 as m2,                          
       dx.d2 as m3                           
from   monthly m,              
       ( select min(d.date) as d1,
                max(d.date) as d2        
         from   daily d            
         where  month(d.date) = month(m.date)
         and    year(d.date) = year(m.date)    
       ) as dx;

但是我收到了错误:

  

DSNT408I SQLCODE = -206, ERROR: M.DATE IS NOT A COLUMN OF结果   AN INSERTED TABLE, UPDATED TABLE, OR ANY TABLE IDENTIFIED结果   IN A FROM CLAUSE, OR IS NOT A COLUMN OF THE TRIGGERING结果   TABLE OF A TRIGGER结果   DSNT418I SQLSTATE = 42703 SQLSTATE RETURN CODE

有没有人对如何做到这一点有任何建议?

有帮助吗?

解决方案

SELECT m.date as m1,               
       MIN(d.date) as m2,                          
       MAX(d.date) as m3
       -- COUNT(d.date) as NbOfDays  -- if so desired...                          
FROM monthly m
JOIN daily d ON month(d.date) = month(m.date) and year(d.date) = year(m.date) 
WHERE -- some condition
GROUP BY m.date
ORDER BY m.date -- or something else...

请注意,这种类型的查询(与问题和响应中显示的其他查询相比,目前为止相对较慢,因为它们意味着表扫描,因此可以为每个查询计算月份(x)和年份(x) [qualifying]行。(即在WHERE子句中放置一个日期范围当然会有帮助。)如果经常运行这种类型的查询,并且如果表的大小很重要,那么 t可能对添加一个这些计算值的列(或者可能是组合值(年 - 月)),这样不仅不需要计算,而且可以索引基础列。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top