0

我有一个表v_leaveallocation_ms,其中包含常用列,例如I_EmpIDandI_EmpName和 2 个带有I_EarnLeaveand的条目I_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)每个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 | 我_EARNLEAVE | I_FROMDATE |
|---------|----------------|-------------|--------- --------------------------|
| 21 | 劳伦斯 | 24 | 2013 年 9 月 16 日 00:00:00+0000 |
| 28 | NRSantharam | 12 | 2013 年 11 月 11 日 00:00:00+0000 |

这是SQLFiddle演示(对于两个查询

于 2013-09-28T06:26:53.077 回答
1

您在发布的结果中没有重复项。劳伦斯的两排有不同的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;

如果您想要i_fromdate两次返回相同的行,您可以替换row_number()dense_rank()

于 2013-09-28T06:27:02.217 回答