Oracle:如何在表中选择基于上次更新的列更改的行

时间:2016-04-14 23:05:58

标签: oracle

我一直试图制定我的查询,但似乎无法得到它。我试过使用rank()但我可能会遗漏一些东西。

以下是样本数据(有超过1个ID):

ID标题Last_update_date
168产品经理4/2/2016
168产品经理3/28/2016
168 Supervisor 2/27/2016
168 Supervisor 2/15/2016
168 Supervisor 2/2/2016
168 Team Lead 1/14/2016
168 Team Lead 1/12/2016
168 Team Lead 1/10/2016
168 Supervisor 1/5/2016
168 Supervisor 1/2/2016
168开发者12/26/2015
168开发者12/15/2015

我想在查询中得到什么:

168 Prod。经理3/28/2016
168 Supervisor 2/2/2016
168 Team Lead 1/10/2016
168 Supervisor 1/2/2016
168开发者12/15/2015

非常感谢帮助。

谢谢,

RS

4 个答案:

答案 0 :(得分:2)

我不认为这里需要分析函数(OldProgrammer的解决方案),当它是“group by”的一个简单的应用程序时。

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

答案 1 :(得分:0)

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

\_ccTag\=.+?\&

可替换地:

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

答案 2 :(得分: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

答案 3 :(得分: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.

解释:此查询与前一个查询非常相似。唯一的困难是按连续的“标题”指定分组,而不是按标题分组,而不考虑时间线,每个id。这是通过在两个不同分区上计算为row_number()的差异的附加列“gp”来实现的。这是一种非常常见的基本技术,但初看起来可能并不明显;它有时被称为“tabibitosan方法”,谷歌为它提供更多信息。