1

私のデータベースには、次のように定義された「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)はこれをサポートしていません。

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

これは本質的に重複排除の問題です。これは、説明した基準に対してセラピストごとに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 に答える