关于在Oracle中对列进行分组的问题

时间:2013-09-28 06:18:43

标签: sql oracle

我有一个表v_leaveallocation_ms,其中包含I_EmpIDI_EmpName等常用列以及I_EarnLeaveI_FromDate的2个条目。

现在我希望通过获取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

我收到了重复的条目。请建议我。enter image description here

2 个答案:

答案 0 :(得分: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)获取I_empid,然后返回表格以获取相应行中的其他列。

第二种方法是使用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 |      Lawrence |          24 | September, 16 2013 00:00:00+0000 |
|      28 | N.R.Santharam |          12 |  November, 11 2013 00:00:00+0000 |

以下是 SQLFiddle 演示(两个查询的

答案 1 :(得分:1)

发布的结果中没有重复项。劳伦斯的两行有不同的i_earnleave。你需要选择其中一个。如果您想要更高的需求,请从group by中删除该列并应用例如一个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;

如果您希望两次返回相同i_fromdate的行,则可以将row_number()替换为dense_rank()