0

誰かが私を助けることができれば、それは素晴らしいことです. 私はSQLが初めてです。これが私のテーブルデータです

テーブル名: emp

e_no    e_name        e_jobrole      position   promotion_date
1   Robin   Sales           CEO 01/01/2012
1   Robin   Sales           CFO 20/01/2010
2   Jackman Sales - S1  EMP 01/04/2009
4   Sheldon Marketing   MGR 15/08/2012
4   Sheldon Marketing   SNRMGR  01/01/2011
4   Sheldon Marketing   MGR 01/01/2011
3   Arnold  Marketing   CEO 09/09/2009
5   Emmy    Marketing   SNRMGR  08/08/2008
6   Penny   Admin           SNRMGR  05/05/2012
6   Penny   Admin           MGR 09/09/2007

これらの人が昇進した日付を注文することにより、その従業員が保持していた以前の役職と現在の役職に隣接するものを取得する必要があります。これは可能ですか?

以下は、出力として必要なものです

e_no e_name e_job prev_pos curr_pos Promotion_date 1 Robin Sales CFO CEO 01/01/2012 2 Jackman Sales - S1 利用不可 EMP 01/04/2009 4 Sheldon Marketing MGR MGR 15/08/2012 3 Arnold Marketing 利用不可 CEO 09/09/2009 5 エミー マーケティングは利用できません SNRMGR 2008 年 8 月 8 日 6 ペニー管理者 MGR SNRMGR 2012 年 5 月 5 日

4

2 に答える 2

0

編集:投稿してから数秒後に間違っていることが証明されたようです:P

1 つのクエリでそれを行うことはできないと思います (複雑なストアド プロシージャを使用する場合を除く)。

データを (Java などで) アプリケーションに取り込み、最も古いデータからデータを解析し、各従業員の「前の位置」を追跡するのはどうでしょうか。次に、すでに「前の位置」を持っているものに到達するたびに、それをテーブルに挿入し、「前の位置」を更新できます(以前に彼女を見たことがない場合は、「前の位置」を設定します" を null/"none"/""/etc) にします。

それは役に立ちますか、それともすべて DB で行う必要がありますか?

于 2012-05-10T15:53:48.370 に答える
0

このようなものがうまくいくはずです。WHERE と HAVING の組み合わせは、調整が必要な場合があります。

select 
  c.e_no, 
  c.e_name, 
  c.e_job, 
  p.position as prev_position, 
  c.position as curr_position, 
  c.promotion_date
from 
  emp c
inner join
  emp p
on 
  c.e_no=p.e_no
group by
  c.e_no, 
  c.e_name, 
  c.e_job, 
  p.position as prev_position, 
  c.position as curr_position, 
where 
  p.promotion_date < c.promotion_date
having 
  max(p.promotion_date),
  max(c.promotion_date)
于 2012-05-10T15:53:58.980 に答える