アプリ版:「スタンプのみでお礼する」機能のリリースについて

table A
A_No, 社員番号, 住所
1 ,0001,'東京都'
2 ,0002,'神奈川県'
3 ,0003,'千葉県'

table B
B_No,社員番号,履歴番号,日付
1,0001,1,2008/09/11
2,0001,2,2008/09/11
3,0002,1,2008/09/05
4,0002,2,2008/09/11

上記のようなtable A, tableBがあるとします。
社員ごとに今日日付で最小の履歴番号を持つB_Noを取得したいのです。
上記で言えば、今日が2008/09/11 だとして社員0001は
最小履歴番号 1 、社員0002は最小履歴番号 2 の
B_Noを取得したいのです。

ただし、フレームワークの仕様によりgroup byが使えません・・・。
なにかいい案はありますか?

どなたか助けてください!
よろしくお願いします。

A 回答 (3件)

何が使えて何が使えないか判らないのですが・・



結合を使うなら・・
select
a.社員番号,
(select min(履歴番号) from tableB b where a.社員番号=b.社員番号 and b.日付>=trunc(sysdate,'dd')) 履歴番号
from tableA a
;

結合を使いたくない、TableBだけでやりたいなら・・
select 社員番号,履歴番号
from
(
select b.*,row_number() over(partition by 社員番号 order by 履歴番号) R
from tableB
where 日付>=trunc(sysdate,'dd')
)
where R=1
;
    • good
    • 0

GROUP BYが使えないというのは文字通りの意味と解していいのですか?


(=GROUP BYの文字がなければよい。集計関数は使ってもよい)

SELECT * FROM TableB s
WHERE s.日付=(指定した日付)
AND 履歴番号 IN (SELECT MIN(履歴番号) FROM TableB WHERE 社員番号=s.社員番号 AND 日付=s.日付)

MINもだめなら、ROWNUMでやるしかないですが。。
    • good
    • 0

社員の数だけSQL分を用意して個別に集計すればよいと思います。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!