2016-04-14 62 views
0

我一直在尝试制定我的查询,但似乎无法得到它。我试图使用rank(),但我可能会错过一些东西。Oracle:如何根据最近一次更新选择列中的行,并根据列更改

下面是示例数据(存在多于1个ID):

ID      标题                                    LAST_UPDATE_DATE
168 PROD 。经理  4/2/2016
168产品经理  2016年3月28日
168监事              2016年2月27日
168监事              2016年2月15日
168监事              2/2/2016
168团队负责人              2016年1月14日
168团队领导              2016年1月12日
168团队领导              2016年1月10日
168监事              1/5/2016
168 Sup ervisor               2016年1月2日
168开发                2015年12月26日
168开发                2015年12月15日

我试图在查询中得到:

168 Prod。经理    2016年3月28日
168监事                2016年2月2日
168团队领导                2016年1月10日
168监事                1/2/2016
168开发                  2015年12月15日

帮助将不胜感激。

感谢,

RS

+0

您正在查找SQL查询,是否正确? –

+0

显示您尝试过的内容。 – OldProgrammer

+0

嗨,我最初的查询完全像mathguy。但是这只会输出3行,因为它是按ID和标题分组的,但是它有Last_Update_Date组件。然后我开始玩排名(),但没有成功。要求看起来很简单,但可以根据需要输出。 – RickshaW

回答

0

出于测试目的,我创建了一个较大的(包括多于一个ID):

SQL> select * from your_table; 

ID   TITLE       LAST_UPDATE_DATE 
---------- ------------------------------ ------------------ 
168  Prod. Manager     04/02/2016 
168  Prod. Manager     03/28/2016 
168  Supervisor      02/27/2016 
168  Supervisor      02/15/2016 
168  Supervisor      02/02/2016 
168  Team Lead      01/14/2016 
168  Team Lead      01/12/2016 
168  Team Lead      01/10/2016 
168  Supervisor      01/05/2016 
168  Supervisor      01/02/2016 
168  Developer      12/26/2015 
168  Developer      12/15/2015 
230  Supervisor      03/03/2016 
230  Supervisor      02/23/2016 
230  Team Lead      02/14/2016 
230  Team Lead      02/01/2016 
230  Supervisor      01/03/2016 

17 rows selected. 

查询:

with a as 
    (
     select id, title, last_update_date, 
      row_number() over (partition by id order by last_update_date) - row_number() 
          over (partition by id, title order by last_update_date) gp 
     from your_table 
    ) 
select id, title, min(last_update_date) update_date 
from a 
group by id, title, gp 
order by id, update_date desc 
/

结果:

ID   TITLE       UPDATE_DAT 
---------- ------------------------------ ---------- 
168  Prod. Manager     03/28/2016 
168  Supervisor      02/02/2016 
168  Team Lead      01/10/2016 
168  Supervisor      01/02/2016 
168  Developer      12/15/2015 
230  Supervisor      02/23/2016 
230  Team Lead      02/01/2016 
230  Supervisor      01/03/2016 

8 rows selected. 

说明:此查询与前一个非常相似。唯一的困难是按照连续的“标题”名称进行分组,而不是按照标题分组,而不考虑时间线。这是通过将附加列“gp”作为两个不同分区上row_number()的差异来计算的。这是一种非常普通和基本的技术,但可能一见不见;它有时被称为“tabibitosan方法”,谷歌为它的更多信息。

+0

非常感谢。我一直在玩各种各样的方式来获得结果。我试图设置ID,标题和日期范围的分组,但无法做到这一点。你的查询做到了。非常感谢。 – RickshaW

0

你需要一个子查询: (编辑:未经测试)

SELECT DISTINCT * 
FROM table 
WHERE Last_update_date = 
    (SELECT MIN(Last_update_date) 
     FROM table t1 
    WHERE t1.Title = table.Title) 

或者:

WITH T1 AS 
    (SELECT Title, MIN(Last_update_date) First_Update 
     FROM table 
     GROUP BY Title) 
SELECT table.* 
FROM table 
INNER JOIN T1 
    ON T1.First_Update = table.Last_update_date 
AND T1.Title = table.Title 
+0

你有没有注意到这个要求?整个表中只有一个ID。我没有看到你加入或按标题分组。这也意味着你可能没有经过测试就发布了你的解决方案......你呢? – mathguy

+0

编辑我的帖子,并修复 –

+0

嗨,实际上,表中有超过1个Id。谢谢! – RickshaW

0
SELECT * 
FROM 
    (SELECT title, 
    last_update_date, 
    row_number() over (partition BY title order by last_update_date) rn 
    FROM test_table 
) 
WHERE rn = 1 
+0

这里一样的东西。这只给了3行。 – RickshaW

2

我没有看到需要r分析函数(OldProgrammer的解决方案),当它是“group by”的简单应用程序时。

select id, title, min(last_update_date) 
    from  your_table -- << -- enter your table name here 
    group by id, title 
+0

这是我最初的查询,它返回3行。 – RickshaW