SQL获取第二笔记录

问题描述:

我正在寻找只从数据集中检索第二个(重复)记录。例如,在下面的图片:SQL获取第二笔记录

enter image description here

的单元ID列内有105为两个单独的记录,我只想要返回的数据集,以返回第二个105记录。此外,我希望此查询返回所有重复记录的第二条记录,而不仅仅是105.

我试过了所有我能想到的,尽管我不是那种经历,而且我也弄不明白。任何帮助将不胜感激。

+2

其中的2行是第二?是他们订购的柱通过? – Lamak

+2

我想这是第一列,JobUnitK(剩下的就是什么),但这完全是猜测。 – user2366842

+0

@Lamak我apoogies,他们将用'为了通过的UnitID递增,DispatchDate asc' –

您需要为此使用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分钟内接受答案。 –

假设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爆炸的查询。

使用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