2016-11-17 163 views
-2

我有一个我正在使用的大型数据集。但是为了简化,让说我有一个这样的数据集:只选择第二个记录

Name | Age | Hire_Date | Manager 
--------------------------------------- 
Bob | 24 | 01/01/2016 | Mark 
Sue | 31 | 01/01/2014 | Fred 
Mark | 37 | 01/01/2011 | Dawn <---- 
Mark | 37 | 01/01/2011 | Cindy <---- 
Jean | 29 | 01/01/2015 | Larry 
Arron | 47 | 01/01/2004 | Todd 

我已经把旁边的箭头第3和第4行显示什么我需要隔离。注意马克的经理是如何从黎明变成辛迪的。我想选择这个数据集,但只选择对应于Mark的两个记录中的一个。我想选择第二,经理是辛迪。

我的数据集非常大,这种情况只发生几次,其中有两条记录像上面那样,只需要选择第二条记录。在Oracle中是否有办法做到这一点,并且仅在示例情况中选择两条记录中的第二条记录,并且包含其他常规记录?

+2

是什么让第3行成为“第一”记录,第4行是第二个记录?其他栏目没有任何区别它们的地方。您的数据中是否还有其他内容(您没有显示)?或者它是一个随机的选择,挑选两者中的任何一个? (不,我不能“注意马克的经纪人是如何从黎明变成辛迪的 - 根据你所展示的数据,它也可以从辛迪变成黎明。) – mathguy

+0

@mathguy,这两个记录正好是除了第一笔记录中的经理姓名是Dawn,第二笔记录中的经理姓名是Cindy。经理姓名区分他们。这不是一个随机的选择。第二张唱片是最新的,所以我会把它放在第一张。换句话说,辛迪很好,黎明不好。非常直截了当。 – Zolt

+1

堆组织表中的行本质上是无序的。没有'ORDER BY'子句的情况下,没有第一行或第二行这样的事情。但似乎没有什么东西可以用来命令结果说Cindy排在Dawn排之后。如果是这样的话,这个问题就不能一般回答。 –

回答

0

假设有额外的信息:

select d.Name, d.Age, d.Hire_Date, max(ManagerId) 
from mydata d 
group by d.Name, d.Age, d.Hire_Date 

更具体地说,你可能会想,有一个日期字段显示当员工被分配到管理者表的加入,则只需使用最大的分配日期。

无论哪种方式,需要更多信息。编辑: 您肯定需要其他信息。至少,您需要一个日期字段,指示经理成为员工经理的时间。对于马克的两行,辛迪的经理生效日期字段将晚于黎明。

+0

这个答案基本上是删除管理器名称字段。这将解决问题,但我需要保留经理姓名字段。 – Zolt

+0

@Zolt - 你是否错过了我所说的“需要更多信息”的部分? (JK)但是,是的,需要更多信息。要么你需要链接到管理者表中......你可以在获得ID的最大值后得到名字,或者你需要考虑mathguy的评论,他在哪里询问什么使得一行成为“第二选择”。您也可以使用group by子句,然后根据某个日期时间字段或其他方法来获取最大值。 – Joe

+0

@Zolt - 我想知道这是怎么回事? – Joe

0
select * from table A , table B 
where A.name = B.name -- add extra conditions to match if you need 
and A.rowid >= B.rowid 

这上面应该工作;但我们需要知道你为什么需要它。以及我需要知道是否重复两次以上你需要它。

+0

你从哪里得到表b?只有一个表 – Zolt

+1

假设稍后插入的行会有更大的'rowid'是一个相当有问题的假设。后面一行可能有一个更大的'rowid',它可能有一个更小的'rowid'。 –

+0

Zolt,都是同一张桌子。尝试并告诉。 –