Sql server SQL获取第二条记录

Sql server SQL获取第二条记录,sql-server,Sql Server,我希望只从数据集中检索第二条(重复)记录。例如,在下图中: 在UnitID列中,有两条105的单独记录。我只希望返回的数据集返回第二条105记录。此外,我希望此查询返回所有重复项的第二条记录,而不仅仅是105条 我已经尝试了我所能想到的一切,尽管我不是那种经历,我也无法理解。任何帮助都将不胜感激。您需要为此使用 举个例子:(我看不懂你的第一个列名,所以我叫它JobUnitK SELECT MAX(JobUnitK), Unit FROM JobUnits WHERE DispatchDate

我希望只从数据集中检索第二条(重复)记录。例如,在下图中:

在UnitID列中,有两条105的单独记录。我只希望返回的数据集返回第二条105记录。此外,我希望此查询返回所有重复项的第二条记录,而不仅仅是105条

我已经尝试了我所能想到的一切,尽管我不是那种经历,我也无法理解。任何帮助都将不胜感激。

您需要为此使用

举个例子:(我看不懂你的第一个列名,所以我叫它
JobUnitK

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

我假设
JobUnitK
是您的订购/id字段。如果不是,只需将
MAX(JobUnitK)
替换为
MAX(FieldIOrderWith)

假设SQL Server 2005及更高版本,您可以使用:

这比基于多种原因使用
Max(JobUnitKeyID)
的解决方案要好:

  • 可能存在多个副本,在这种情况下,将
    Min(JobUnitKeyID)
    UnitID
    结合使用,以在需要
    JobUnitKeyID
    MinJobUnitKeyID`的
    UnitID
    上重新连接
  • 除此之外,使用
    Min
    Max
    要求您重新连接到相同的数据(这将本质上较慢)
  • 如果您使用的排序键被证明是非唯一的,那么您将无法使用任何一个来提取正确数量的行
  • 如果排序键由多列组成,则使用
    Min
    Max
    的查询将在复杂性上爆炸

使用
RANK
函数。按UnitId将
分区上的行排序,并选择排名为2的行

供参考-


这两行中哪一行是第二行?它们是按哪列排序的?我猜是按第一列JobUnitK排序的(不管其余的是什么),但这纯粹是猜测。@Lamak my apoogies,它们将按UnitID asc、DispatchDate asc的
顺序进行排序,但在示例数据中,两行都有确切的
DispatchDate
,这很好。尽管它没有像问题所问的那样返回整行,也没有真正返回“秒”row,因为没有排序,这完全符合我的期望!我以前从未见过
这个词。因此,在我盲目地从互联网上获取代码之前,你能向我解释一下吗?@ChaseErnst肯定,
的工作原理与
WHERE
类似,但对于
groupby
。基本上,它只返回
groupb>所在的行Y
子句将返回多于1行。好的,这很有意义!谢谢。我可以在5分钟内接受答案。@ChaseErnst没问题。很高兴我能提供帮助!@ChaseErnst当然,只需将
MAX
切换到
MIN
Rank
按UnitId分区可能会失败,因为
Rank
需要
ORDER BY
命令>子句,并且ordered by列本身可能有重复项,因此需要使用
行号
(即使
密集列
也不会解决所有重复项,因为第一个集合也可能是重复的)。出于类似的原因,
=2
是不正确的,它必须是
=2
。最后,您的答案不完整,但与页面上的另一个答案几乎相同,该页面将详细介绍您的答案。
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
;