表1の日付に基づいて、表2から最小/最大日付を選択するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1641988

質問

月ごとのテーブル(月の最初の日と一意の制約を持つ行のみを保持し、それぞれ1つだけを保持)と、毎日の同様の情報を含む日ごとのテーブル(同じ取引、1日に1つのみ)があります:

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

ただし、日が足りない可能性があります。

月次表の各日付に対して、その日付と日次表のその月の最小および最大日付を返すクエリを実行します(どうしても必要な場合はDB2固有の標準SQLを使用します)。

したがって、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、エラー:M.DATEは次の列ではありません
  挿入されたテーブル、更新されたテーブル、または特定されたテーブル
   from句で、またはトリガーの列ではありません
  トリガーの表
   DSNT418I SQLSTATE = 42703 SQLSTATEリターンコード

これを行うための最善の方法について何かアドバイスはありますか?

役に立ちましたか?

解決

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...

このタイプのクエリ(これまでの質問と回答に示されている他のクエリは、テーブルスキャンを暗示しているため、それぞれに対してmonth(x)とyear(x)を計算できるため、比較的遅いことに注意してください。 [修飾]行(つまり、WHERE句に日付の範囲を設定することはもちろん役立ちます)。このタイプのクエリが頻繁に実行され、テーブルのサイズが大きい場合、i tはこれらの計算された値の列(または場合によっては結合された値(年-月)の列。計算が不要であるだけでなく、基礎となる列にインデックスを付けることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top