在我的数据库中有一个名为“预算”的表,定义如下
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
我想编写一个查询,该查询返回每个治疗师一行,并带有最新数据(上述数据显示治疗师 36 在 2012 年 1 月至 6 月期间每月有权享受 8 小时假期,而从 2012 年 7 月开始,她是有权每月工作 10 小时)。换句话说,如果我对日期 31/01/2012 发出查询,我希望得到第 1 行和第 3 行;如果我针对日期 31/05/2012 发出查询,我希望返回第 1 行和第 4 行,如果我针对日期 31/08/2012 发出查询,我希望返回第 2 和第 4 行。
下面的查询给了我一个治疗师一行,但它给了我疾病和假期的最大值,这不一定是我想要的。
select therapist, max (illness), max (holiday)
from budget
where curdate <= '2012-08-31'
group by therapist
表格中是否应该有第五行
ID: 5, THERAPIST: 74, CURDATE: 01/07/2012, ILLNESS: 6, HOLIDAY: 6
在 2012 年 8 月 31 日查询将返回疾病 = 8 和假期 = 10,即使它们都应该是 6。
我尝试了以下查询,但这仅返回一行
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上有类似的问题,但似乎都不适用于我的情况。当然,如果我可以在没有聚合函数的情况下使用“分组依据”,但 Firebird(和大多数 DBMS)不支持这一点,生活会更轻松。