2015-10-05 53 views
1

我正在尋找只從數據集中檢索第二個(重複)記錄。例如,在下面的圖片:SQL獲取第二筆記錄

enter image description here

的單元ID列內有105爲兩個單獨的記錄,我只想要返回的數據集,以返回第二個105記錄。此外,我希望此查詢返回所有重複記錄的第二條記錄,而不僅僅是105.

我試過了所有我能想到的,儘管我不是那種經歷,而且我也弄不明白。任何幫助將不勝感激。

+2

其中的2行是第二?是他們訂購的柱通過? – Lamak

+2

我想這是第一列,JobUnitK(剩下的就是什麼),但這完全是猜測。 – user2366842

+0

@Lamak我apoogies,他們將用'爲了通過的UnitID遞增,DispatchDate asc' –

回答

1

您需要爲此使用GROUP BY

下面是一個例子:(我看不懂你的第一個列名,所以我給它JobUnitK

SELECT MAX(JobUnitK), Unit 
FROM JobUnits 
WHERE DispatchDate = 'oct 4, 2015' 
GROUP BY Unit 
HAVING COUNT(*) > 1 

我假設JobUnitK是您的訂購/ id字段如果不是,只是。 。與MAX(FieldIOrderWith)取代MAX(JobUnitK)

+0

這完全按照我的意願工作!我從來沒有見過「HAVING」這個詞。所以在我盲目地從互聯網上取得代碼之前,你能向我解釋一下嗎? –

+0

@ChaseErnst當然,'HAVING'的工作原理與WHERE相似,但是對於GROUP BY。基本上,它只返回'GROUP BY'子句返回多於一行的行。 –

+0

好的,這很有道理!謝謝。我可以在5分鐘內接受答案。 –

1

假設SQL Server 2005和了,你可以使用Row_Number windowing function

WITH DupeCalc AS (
    SELECT 
     DupID = Row_Number() OVER (PARTITION BY UnitID, ORDER BY JobUnitKeyID), 
     * 
    FROM JobUnits 
    WHERE DispatchDate = '20151004' 
    ORDER BY UnitID Desc 
) 
SELECT * 
FROM DupeCalc 
WHERE DupID >= 2 
; 

這比使用Max(JobUnitKeyID)出於多種原因一個更好的解決方案:

  • 可能有多個重複的,在這種情況下與UnitID結合使用Min(JobUnitKeyID)加入回到了UnitID其中JobUnitKeyID <> MinJobUnitKeyID`是必須的。
  • 除了使用MinMax需要你加入回相同的數據(這將是固有的慢)。
  • 如果您使用的排序鍵結果不是唯一的,那麼您將無法使用任何一個排列正確的行數。
  • 如果排序鍵由多列,使用複雜MinMax爆炸的查詢。
1

使用RANK功能。對行排序OVER PARTITION BY UnitId並選擇等級2的行。

僅供參考 -

https://msdn.microsoft.com/en-IN/library/ms176102.aspx

+0

'''PARTITION BY UnitId'上的'Rank'可能失敗,因爲'Rank'需要一個'ORDER BY'子句,並且按列排序可能有自己的副本,因此需要'Row_Number'而不是'Dense_Rank'解決所有的重複,因爲第一組可能也是重複的)。由於類似的原因,'= 2'不正確,它必須是'> = 2'。最後,你的答案是一個不完整但接近重複的另一個更詳細的頁面。 – ErikE