2016-11-17 129 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,都是同一張桌子。嘗試並告訴。 –