私のデータベースには、次のように定義された「Budget」というテーブルがあります。
CREATE TABLE BUDGET (
ID INTEGER NOT NULL,
THERAPIST INTEGER,
CURDATE DATE,
ILLNESS SMALLINT,
HOLIDAY SMALLINT);
ALTER TABLE BUDGET ADD PRIMARY KEY (ID);
この表の目的は、セラピストが病気休暇と定休日を月に何時間受けることができるかを保存することです。
テーブルの値は次のとおりです
ID: 1, THERAPIST: 36, CURDATE: 01/01/2012, ILLNESS:8, HOLIDAY: 8
ID: 2, THERAPIST: 36, CURDATE: 01/07/2012, ILLNESS:8, HOLIDAY: 10
ID: 3, THERAPIST: 74, CURDATE: 01/01/2012, ILLNESS:8, HOLIDAY: 8
ID: 4, THERAPIST: 74, CURDATE: 01/03/2012, ILLNESS:8, HOLIDAY: 10
最新のデータを使用して、セラピストごとに1行を返すクエリを作成したいと思います(上記のデータは、セラピスト36が2012年1月6日から月に8時間の休暇をとることができ、2012年7月から月額10時間の権利があります)。つまり、2012年1月31日の日付のクエリを発行すると、1行目と3行目が返されることを期待しています。2012年5月31日の日付のクエリを発行すると、行1と4が返されると予想され、2012年8月31日の日付のクエリを発行すると、2行と4行が返されると予想されます。
次のクエリでは、セラピストごとに1行が表示されますが、病気と休日の最大値が表示されます。これは、必ずしも私が望むものではありません。
select therapist, max (illness), max (holiday)
from budget
where curdate <= '2012-08-31'
group by therapist
テーブルに5行目があるはずです
ID: 5, THERAPIST: 74, CURDATE: 01/07/2012, ILLNESS: 6, HOLIDAY: 6
31/08/12にクエリを実行すると、両方とも6である必要がありますが、sillage=8とholiday=10が返されます。
次のクエリを試しましたが、1行しか返されません
select therapist, illness, holiday
from budget
where curdate =
(select max (curdate) from budget b
where b.therapist = budget.therapist
and b.curdate <= '2012-08-31')
SOについても同様の質問がありますが、私の状況には当てはまらないようです。もちろん、集計関数なしで「group by」を使用できれば、作業は楽になりますが、Firebird(およびほとんどのDBMS)はこれをサポートしていません。