在SQL Server中查找倒数第二条记录(如果有的话,否则为最后一条记录)。

3
我有一个记录如下的表格:

enter image description here

我想要获取Id为4、7和9的记录。
对于每个第二个(如果存在多个)记录,我想要获取详细信息。在上面的表格中,我想要获取以下内容: - 对于ticketid 1001,获取id 4 - 对于ticketid 1002,获取id 7 - 对于ticketid 1003,获取id 9,因为它没有其他id。

2
SQL Server 的版本是什么?同时,请将您的样本数据以文本形式展示,以便我们创建 SQL Fiddle。 - Tim Schmelter
2个回答

4

在SQL Server 2005及更高版本中,您可以使用以下方法:

WITH CTE AS
(
    SELECT ID, Status, TicketID,
           RN = ROW_NUMBER() OVER (PARTITION BY TicketID ORDER BY ID DESC),
           CNT = COUNT(*) OVER (PARTITION BY TicketID)
    FROM dbo.TableName t
)
SELECT ID, Status, TicketID
FROM CTE
WHERE CNT = 1 OR RN = 2

如果您不想使用类似于子查询/视图的公共表达式:

SELECT x.ID, x.Status, x.TicketID
FROM ( SELECT ID, Status, TicketID,
              RN = ROW_NUMBER() OVER (PARTITION BY TicketID ORDER BY ID DESC),
              CNT = COUNT(*) OVER (PARTITION BY TicketID)
       FROM dbo.TableName t ) x
WHERE x.CNT = 1 OR x.RN = 2

我们能否不使用CTE来完成这个操作呢?就像简单的select一样。实际上,我想将这个结果与大量数据进行连接,所以如果我们能找到一些替代方案就太好了。顺便说一下,感谢你的回答。 - Subo
@Subo:你可以将这个CTE与其他表连接。就像使用简单的子查询一样。 - Tim Schmelter
@Subo:然而,我已经编辑了我的答案,提供了一个子查询。 - Tim Schmelter
棒极了伙计。让我检查一下。谢谢@Tim。 - Subo

0

请尝试以下方法:

为您的表生成一个序列号,然后在where子句中应用条件。

例如:where 派生列名称 %2 = 0

请分享您的完整信息,包括数据和您想从输入中得到的确切内容。

这样我们就能更清楚地了解您的问题并提供解决方案。

谢谢。


这不是更像是一条评论而不是答案吗?此外,他已经提供了数据和期望的结果。 - Tim Schmelter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接