如何根据表1中的日期从表2中选择最小/最大日期?
题
我有一个月度表(仅包含每月第一天的行,并且每个只有一个的唯一约束)和每天具有相似信息的每日表(相同的交易,每天只有一个):
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可能对添加一个这些计算值的列(或者可能是组合值(年 - 月)),这样不仅不需要计算,而且可以索引基础列。
不隶属于 StackOverflow