0

v_leaveallocation_msなどの一般的な列を含むテーブルがあり、 と を含む2 つのエントリがあります。I_EmpIDI_EmpNameI_EarnLeaveI_FromDate

ここで、I_Fromdate の最後のエントリを取得して I_EarnLeave を取得することにより、2 つの行を単一の行に取得したいと考えています。

select distinct I_empid, I_empname, I_Earnleave, max(I_FromDate) 
from v_leaveallocation_ms 
where i_departmentid = 2
group by I_empid, I_empname, I_Earnleave

重複したエントリを取得しました。私に提案してください。ここに画像の説明を入力

4

2 に答える 2

1

このようなものをお探しですか?

SELECT l.I_empid, l.I_empname, l.I_Earnleave, l.I_FromDate
  FROM 
(
    SELECT I_empid, MAX(I_FromDate) I_FromDate
      FROM v_leaveallocation_ms
     WHERE i_departmentid = 2 
     GROUP BY I_empid     
) q JOIN v_leaveallocation_ms l
    ON q.I_empid = l.I_empid
   AND q.I_FromDate = l.I_FromDate

サブクエリでは、MAX(I_FromDate)perI_empidを取得してからテーブルに結合して、対応する行から他の列を取得します。

2番目のアプローチは、ROW_NUMBER()分析関数を使用することです

SELECT I_empid, I_empname, I_Earnleave, I_FromDate
  FROM
(
  SELECT I_empid, I_empname, I_Earnleave, I_FromDate,
          ROW_NUMBER() OVER (PARTITION BY I_empid ORDER BY I_FromDate DESC) rnum
    FROM v_leaveallocation_ms
   WHERE i_departmentid = 2
) q
 WHERE rnum = 1

出力:

| | I_EMPID | I_EMPNAME | I_EARNLEAVE | I_FROMDATE |
|---------|---------------|-------------|--------- --------------------------|
| | 21 | ローレンス | ローレンス | 24 | 2013 年 9 月 16 日 00:00:00+0000 |
| | 28 | NRサンタラム | 12 | 2013 年 11 月 11 日 00:00:00+0000 |

これがSQLFiddleデモです(両方のクエリ用

于 2013-09-28T06:26:53.077 に答える
1

投稿された結果に重複はありません。Lawrence の 2 つの行の は異なりi_earnleaveます。それらのいずれかを選択する必要があります。より高い値が必要な場合は、その列を から削除し、group byたとえば a を適用しますmax()

select I_empid, I_empname, max(I_Earnleave), max(trunc(I_FromDate)) 
from v_leaveallocation_ms 
where i_departmentid = 2
group by I_empid, I_empname;

最新のものなどに属するすべての列が必要な場合i_fromdateは、ウィンドウ関数を使用できます。

select i_empid, i_empname, i_earnleave, i_fromdate
from (
   select i_empid, i_empname, i_earnleave, i_fromdate,
          row_number() over (partition by i_empid order by i_fromdate desc) as rn
   from v_leaveallocation_ms
   where i_departmentid = 2
) t
where rn = 1;

同じ行を 2 回返したい場合はi_fromdate、次のように置き換えることができますrow_number()dense_rank()

于 2013-09-28T06:27:02.217 に答える