SQL获取第二笔记录
我正在寻找只从数据集中检索第二个(重复)记录。例如,在下面的图片:SQL获取第二笔记录
的单元ID列内有105为两个单独的记录,我只想要返回的数据集,以返回第二个105记录。此外,我希望此查询返回所有重复记录的第二条记录,而不仅仅是105.
我试过了所有我能想到的,尽管我不是那种经历,而且我也弄不明白。任何帮助将不胜感激。
您需要为此使用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)
这完全按照我的意愿工作!我从来没有见过“HAVING”这个词。所以在我盲目地从互联网上取得代码之前,你能向我解释一下吗? –
@ChaseErnst当然,'HAVING'的工作原理与WHERE相似,但是对于GROUP BY。基本上,它只返回'GROUP BY'子句返回多于一行的行。 –
好的,这很有道理!谢谢。我可以在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`是必须的。 - 除了使用
Min
或Max
需要你加入回相同的数据(这将是固有的慢)。 - 如果您使用的排序键结果不是唯一的,那么您将无法使用任何一个排列正确的行数。
- 如果排序键由多列,使用复杂
Min
或Max
爆炸的查询。
使用RANK
功能。对行排序OVER
PARTITION BY UnitId并选择等级2的行。
仅供参考 -
'''PARTITION BY UnitId'上的'Rank'可能失败,因为'Rank'需要一个'ORDER BY'子句,并且按列排序可能有自己的副本,因此需要'Row_Number'而不是'Dense_Rank'解决所有的重复,因为第一组可能也是重复的)。由于类似的原因,'= 2'不正确,它必须是'> = 2'。最后,你的答案是一个不完整但接近重复的另一个更详细的页面。 – ErikE
其中的2行是第二?是他们订购的柱通过? – Lamak
我想这是第一列,JobUnitK(剩下的就是什么),但这完全是猜测。 – user2366842
@Lamak我apoogies,他们将用'为了通过的UnitID递增,DispatchDate asc' –