1

在我的数据库中有一个名为“预算”的表,定义如下

 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)不支持这一点,生活会更轻松。

4

3 回答 3

2

如果我正确理解了您的问题,我认为您想要:

select
    b.*
from
    budget b
    join (
        select
            therapist,
            max(curdate) as maxdate
        from
            budget
        where 
            curdate <= '2012-08-31'
        group by
            therapist
    ) grouped on grouped.therapist = b.therapist and grouped.maxdate = b.curdate
于 2012-08-10T18:27:19.597 回答
1

这本质上是一个重复数据删除问题,因为如果您尝试清理数据以使每个治疗师只有一行符合您描述的标准,您也会遇到同样的问题。这很少是简单的。

也就是说,您可以在当前情况下使用以下内容:

select b.id, b.therapist, t.[curdate], b.illness, b.holiday
from budget b
inner join
(
    select therapist, MAX([curdate]) as [curdate]
    from BUDGET
    where [CURDATE] <= '2012-08-31'
    group by THERAPIST
) t on b.therapist = t.therapist and b.[CURDATE] = t.[curdate]
于 2012-08-10T18:47:17.903 回答
-1

我认为它会是这样的:

select * from therapist t
join budget a
on t.therapist=a.therapist
where id in (
select first 1 ID from BUDGET b
where 
b.theraphist=t.therapist and
b.curdate <= '2012-08-31'
order by curdate desc)
于 2012-08-10T18:21:36.087 回答