Oracle:如何根据上次更新选择列发生更改的表中的行
我一直试图表达我的疑问,但似乎无法理解。我试过使用rank,但可能遗漏了什么 以下是超过1个ID的示例数据: ID标题上次更新日期 168生产经理4/2/2016 168产品经理2016年3月28日 168主管2016年2月27日 168主管2016年2月15日 168主管2016年2月2日 168团队负责人1/14/2016 168团队负责人2016年12月1日 168团队负责人2016年10月1日 168主管1/5/2016 168主管1/2/2016 168开发商2015年12月26日 168开发商2015年12月15日 我试图在查询中获取的内容: 168产品经理2016年3月28日 168主管2016年2月2日 168团队负责人2016年10月1日 168主管1/2/2016 168开发商2015年12月15日 非常感谢您的帮助 谢谢 RS您需要一个子查询: 编辑:未经测试Oracle:如何根据上次更新选择列发生更改的表中的行,oracle,Oracle,我一直试图表达我的疑问,但似乎无法理解。我试过使用rank,但可能遗漏了什么 以下是超过1个ID的示例数据: ID标题上次更新日期 168生产经理4/2/2016 168产品经理2016年3月28日 168主管2016年2月27日 168主管2016年2月15日 168主管2016年2月2日 168团队负责人1/14/2016 168团队负责人2016年12月1日 168团队负责人2016年10月1日 168主管1/5/2016 168主管1/2/2016 168开发商2015年12月26日 1
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
您需要一个子查询:
编辑:未经测试
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
我不认为这里需要分析函数,因为它是一个简单的GROUPBY应用程序
select id, title, min(last_update_date)
from your_table -- << -- enter your table name here
group by id, title
我不认为这里需要分析函数,因为它是一个简单的GROUPBY应用程序
select id, title, min(last_update_date)
from your_table -- << -- enter your table name here
group by id, title
出于测试目的,我创建了一个更大的表以包含多个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.
查询:
结果:
说明:此查询与前面的查询非常相似。唯一的困难是对每个id按连续的标题指定进行分组,而不是不考虑时间线按标题进行分组。这是通过计算两个不同分区上行数之差的附加列gp来实现的。这是一种非常普通和基本的技术,但乍一看可能并不明显;它有时被称为tabibitosan方法,有关详细信息,请使用谷歌搜索。出于测试目的,我创建了一个更大的表,其中包含多个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.
查询:
结果:
说明:此查询与前面的查询非常相似。唯一的困难是对每个id按连续的标题指定进行分组,而不是不考虑时间线按标题进行分组。这是通过计算两个不同分区上行数之差的附加列gp来实现的。这是一种非常普通和基本的技术,但乍一看可能并不明显;它有时被称为tabibitosan方法,谷歌搜索更多信息。您正在寻找SQL查询,对吗?请展示您尝试过的内容。您好,我最初的查询与mathguy完全一样。但这将只输出3行,因为它是按Id和标题分组的,但其中有最后一个更新日期组件。然后,我开始和军衔打交道,但没有成功。需求看起来很简单,但可以根据需要将其输出。好的,这是一个不同的需求。每次头衔发生变化时,你都要开始计时,即使同一个人过去拥有相同的头衔,但在这段时间里,他们拥有不同的头衔。这是可以做到的,但要复杂一点-在我构建和测试它之后,我会发布我的答案。我希望这可以通过查询而不是编写过程来完成。您正在寻找SQL查询,对吗?请展示您尝试过的内容。您好,我的初始查询与mathguy完全一样。但这将只输出3行,因为它是按Id和标题分组的,但其中有最后一个更新日期组件。然后,我开始和军衔打交道,但没有成功。需求看起来很简单,但可以根据需要将其输出。好的,这是一个不同的需求。每次头衔发生变化时,你都要开始计时,即使同一个人过去拥有相同的头衔,但在这段时间里,他们拥有不同的头衔。这是可以做到的,但要复杂一点——我会在构建和测试它之后发布我的答案。我希望这可以通过查询而不是编写过程来完成。你注意到这个要求了吗?整个表中只有一个ID。我看不出你在哪里加入,也看不到你在哪里按头衔分组。这也意味着您可能未经测试就发布了解决方案。。。是吗?编辑了我的帖子并修复了这个问题嗨,实际上,表中有不止一个Id。谢谢你注意到要求了吗?整个表中只有一个ID。我看不出你在哪里加入,也看不到你在哪里按头衔分组。这也意味着您可能未经测试就发布了解决方案。。。是吗?编辑了我的帖子并修复了这个问题嗨,实际上,表中有不止一个Id。谢谢这是我的初始查询,返回了3行。这是我的初始查询,返回了3行。这里也是一样。这只返回3行。这里也是一样。这只会退回3行。非常感谢。我一直在用不同的方法来获得结果。我试图设置一组Id、标题和日期
但他没能做到。你的查询成功了。非常感谢,非常感谢。我一直在用不同的方法来获得结果。我试图设置一组Id、标题和日期范围,但没能做到。你的查询成功了。非常感谢。