2017-12-06 5 views
1

従業員の次の取引(109,154,982,745)に最新のアクティビティコード(A、V、W、J)を選択する必要があります。私は、従業員の最後の取引が(そのリストから)その活動コードの1つを持っていたことを知る必要があります。従業員IDの結合に関連する2つのテーブルがあります。 表1:2つの異なる属性に基づいて最新の行を選択するにはどうすればよいですか?

|Emp_id | STUFF 
| 1  | stuff 
| 2  | stuff 
| 3  | stuff 

表2:

|Emp_id | date  | act_code | trans 
| 1  | 1/1/17 | A  | 109 
| 1  | 3/4/12 | X  | 203 
| 1  | 2/14/09 | A  | 154 
| 2  | 1/1/17 | A  | 110 
| 2  | 6/6/13 | V  | 109 
| 3  | 12/13/16 | J  | 982 
| 3  | 11/23/14 | W  | 745 
| 4  | 12/13/16 | X  | 154 
| 4  | 11/23/14 | W  | 745 

私は返すしたいのですが何がある:最新のトランスは一つではないので、

|Emp_id | STUFF | date  | act_code | trans 
| 1  | stuff | 1/1/17 | A  | 109 
| 3  | stuff | 12/13/16 | J  | 982 

Empの2が選択されません正しい値の最新のact_codeが正しい値ではないため、Emp 4は選択されません。誰でもこれについてどうやって行くのか考えていますか?前もって感謝します。

+1

emp 2には最新の値「a」がありますが、選択しないでください。 –

+0

取引が110(リストに含まれていないため) – user7002207

答えて

1

これは片道です。

SELECT t2.emp_id, t1.stuff, t2.date, t2.act_code, t2.trans, 
     ROW_NUMBER() over (PARTITION BY t2.emp_id ORDER BY t2.date DESC) RN 
FROM Table1 t1 
JOIN Table2 t2 on t1.emp_id = t2.emp_id; 

次に選択し、外であなたのリスト内の値を持っているだけで、最新の記録(RN = 1)にこれをフィルタ:

emp_idで行を分割し、 dateで行を注文する

使用ROW_NUMBER()

SELECT emp_id, stuff, date, act_code, trans 
FROM (
    SELECT t2.emp_id, t1.stuff, t2.date, t2.act_code, t2.trans, 
      ROW_NUMBER() over (PARTITION BY t2.emp_id ORDER BY t2.date DESC) RN 
    FROM Table1 t1 
    JOIN Table2 t2 on t1.emp_id = t2.emp_id 
    ) A 
WHERE RN = 1 
AND trans IN (109, 154, 982, 745) 
AND act_code IN ('A', 'V', 'W', 'J'); 
+0

こんにちは、ご意見ありがとうございます。これは私に私が求めた結果を与えているようだ!私はすぐに質問をしました。これは最新の行動コードとトランスを返しています。同じデータを返す方法はありますか?10/01/2016の後ですか? (私は最初の質問にこれを加えていたはずでした;それは私の見解でした) – user7002207

+0

@ user7002207心配しないで、喜んで助けてください。 2011年10月1日以降にあなたが言うときは、最新のレコードが2011年10月10日以降でない限り、レコードを見たくないということですか?その場合は、外側の選択フィルタに 'AND date> '20161001'を追加するだけです。私はそのことを正しく理解しているかどうかわからない。 –

0

first_valueを使用して、act_code、transの最新の値を取得し、指定されたリストに含まれているかどうかを確認します。

select * from (
select distinct t1.emp_id,t1.stuff, 
max(t2.date) over(partition by t2.emp_id) as latest_date, 
first_value(t2.act_code) over(partition by t2.emp_id order by t2.date desc) as latest_act_code, 
first_value(t2.trans) over(partition by t2.emp_id order by t2.date desc) as latest_trans 
from tbl1 t1 
join tbl2 t2 on t1.emp_id=t2.emp_id 
) t 
where latest_act_code in ('A','V','W','J') and latest_trans in (109, 154, 982, 745) 
関連する問題