Life Goes On

まあまあだけど楽しんでる方です

指定日以前の最新値を取り出す

sqlである日以前の最新の時の値を取り出す - imHo を見て、書いてみました。
mokehehe さんのとは逆に、日付→残高→口座の順に取得するイメージ。
Oracle だと date は予約語なので名前を変えたり、↓の本の影響で id → account_id としたりしてます。
結合する表が3つになるのは仕方ないと思うので、あとは各クエリをどれだけ簡単に書けるかということかな。

SELECT a.account_id, b1.day, b1.amount
  FROM balance b1
 INNER JOIN (
       SELECT account_id, max(day) AS day
         FROM balance
        WHERE day < 日付
        GROUP BY account_id) b2
    ON b1.account_id = b2.account_id
   AND b1.day = b2.day
 RIGHT OUTER JOIN account a
    ON b1.account_id = a.account_id
 WHERE a.user_id = 顧客ID
 ORDER BY a.account_id
;

SQL のインデントって、毎回ものすごく悩みます。今回のはそんなに悪くないかも。