【问题标题】:How do I select min/max dates from table 2 based on date in table 1?如何根据表 1 中的日期从表 2 中选择最小/最大日期?
【发布时间】:2010-12-11 03:35:47
【问题描述】:

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

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 的 SQL)。

所以,如果缺少一月的最后一周和二月的第一周,我需要:

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

有人对如何最好地做到这一点有任何建议吗?

【问题讨论】:

    标签: sql database select db2 subquery


    【解决方案1】:
    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 子句中设置日期范围当然会有所帮助)。如果这种类型的查询经常运行并且表的大小很大,那么 it 添加一个这些计算值的列(或者可能是组合值(年-月)的列,因此不仅不需要计算,而且可以索引基础列。

    【讨论】:

    • 我们已经考虑了性能影响,但它是一个有限的历史数据库。我们在月表中只有 24 个月,在日表中只有 700 多天。性能不会有问题。但是,如果日期字段上有索引,肯定不会是全表扫描?
    • 完美,给了我想要的东西。干杯,+1 并接受。
    • 如果您对索引字段执行计算以匹配它们,则索引将被忽略,除非您按照 mjv 的建议添加列并为该计算创建索引。
    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2019-02-07
    • 2014-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多