0

以下に示すように、ソーステーブルにデータがあります。

Employee_Id Status  Date        Address Phone number
52345       N       28-Jan-10   ABC     9833455456
52345       N       30-Apr-10   ABC     9833455456
52345       Y       13-Dec-10   ABC     9934467879
10145       N       25-Mar-10   PQR     8766129989
32456       N       20-Jun-10   XYZ     9860799849
32456       N       03-Nov-10   XYZ     9860799849
32456       Y       07-Feb-11   XYZ     9860799849
32456       Y       22-May-11   XYZ     8977767889
32456       N       18-Sep-11   DEF     9811223300
42123       N       25-Feb-10   MNO     9920030048
42123       N       23-Sep-11   MNO     9833445566

目的は、出力で従業員の一意のレコードを取得することですが、以下の基準に基づいています。

  1. 従業員 ID が一意の場合は、そのまま渡します。
  2. 従業員 ID が重複している場合は、status="Y" のレコードを渡します</li>
  3. status="Y" を適用しても Employee Id が重複する場合は、日付が最新のレコードを選択します。

これらのルールを使用すると、次の結果が得られるはずです。

Employee_Id Status  Date        Address Phone number
52345       Y       13-Dec-10   ABC     9934467879
10145       N       25-Mar-10   PQR     8766129989
32456       Y       22-May-11   XYZ     8977767889
42123       N       23-Sep-11   MNO     9833445566
4

1 に答える 1

0

row_number() 関数を使用して、必要なものを取得できます。

select t.*
from (select t.employee_id,
             row_number() over (partition by employee_id order by status desc, date desc) as seqnum,
             count(*) over (partition by employee_id) as cnt
      from t
     ) t
where seqnum = 1 and not (cnt > 1 and status = 'N')

これにより、各従業員のステータス順 (最初に「Y」)、次に日付順 (最新順) で行が並べ替えられます。次に、このグループの最初のものを選択します。

行が 1 つしかない場合は、seqnum = 1 になります。

「Y」が 1 つしかない場合は、seqnum = 1 になります。

「Y」が複数ある場合は、日付が最新のものを選択します。

于 2012-07-18T14:27:28.487 に答える