我有一个表v_leaveallocation_ms
,其中包含I_EmpID
和I_EmpName
等常用列以及I_EarnLeave
和I_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
我收到了重复的条目。请建议我。
答案 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()