Sql 如何检索最后一行的第二行?

Sql 如何检索最后一行的第二行?,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有一个有很多记录的表,我只想知道我最后一秒创建的记录 例如:我有一个表customer,其中customerID是随机数 现在我想选择最后一行 输出行: customerID customer_name cont_no 5 revas 1 我不想要第二高的 我要倒数第二排。如你所说,我可以给你举个例子 想象一下,你有一整袋苹果。你怎么能拿最后一个苹果?你怎么知道哪个是倒数第二?如果你不以任何方式对它们进行排序,你就不能这样做 目前

我有一个有很多记录的表,我只想知道我最后一秒创建的记录

例如:我有一个表customer,其中customerID是随机数

现在我想选择最后一行

输出行:

customerID      customer_name   cont_no
5               revas           1
我不想要第二高的


我要倒数第二排。

如你所说,我可以给你举个例子

想象一下,你有一整袋苹果。你怎么能拿最后一个苹果?你怎么知道哪个是倒数第二?如果你不以任何方式对它们进行排序,你就不能这样做

目前,您的数据未排序,因此无法按预期完成。只有在您具有任何排序条件(如Id、创建日期等)后,才能在以下步骤中执行此操作

试试这个

;WITH tbl_rn AS (
    select 
        RowNum = row_number() OVER (ORDER BY @@rowcount),
        customerID,
        customer_name,
        cont_no
    from  tbl
)
select 
    customerID,
    customer_name,
    cont_no
from tbl_rn 
where RowNum = (select max(RowNum) - 1 from tbl_rn)
在这里,RowNum是一个列,它对表中的行进行编号,而不进行排序


maxRowNum-1将给出最后第二个帖子作为答案,因为这是一个大评论


大卫:好的,我下次会做的,但我现在能做的是解决这个问题,有很多记录在千分之一。有什么方法可以做到这一点吗@迪潘舒卡拉拉

我:@david sam,我认为现在没有办法做到这一点。 最好的办法是在excel中复制这一千条记录,并希望它们是按顺序插入的。在那里创建一个手动列,就像使用自动增量时一样。并通过在表本身中插入该列来更正表结构,正如您所说的那样

在对数据进行有效搜索之前,应该对其进行排序

我建议使用autoincrement在表id中添加一个额外字段

这没什么大不了的,如下所示:

查询:

SELECT        TOP (1) customerID, customer_name, cont_no, id
FROM            (SELECT        TOP (2) customerID, customer_name, cont_no, id
                          FROM            customer
                          ORDER BY id DESC) AS t
ORDER BY id
前2个数据是以降序方式选择的,您可以从中获得 基于id值的结果如下:

8,7 8值在所示示例中可用

接下来以ASC升序方式选择前1个值

输出:


正如您可能已经知道的,您需要一个列来完成此任务。OVER子句可用于此目的

;WITH CTE as
(
  SELECT 
    customerid, customer_name, cont_no, 
    row_number() over (order by newlymadesortcolumn desc) rn
  FROM customer
)
SELECT customerid, customer_name, cont_no
FROM CTE
WHERE rn = 2

选择identityint,1,1作为Id,*进入来自客户的temp 选择*from temp,其中Id=选择maxId作为temp group by Id-1的计数
使用SQL Server 2012或更高版本删除表temp,只需一行代码即可:

LAG([MyValue],1) OVER (PARTITION BY [Category] ORDER BY [AnyColumnForOrdinal] ASC)

我知道这太晚了,但你可以试试这个

SELECT TOP 1 * FROM (SELECT * FROM dbo.customer
EXCEPT SELECT TOP (SELECT (COUNT(*)-2) FROM dbo.customer ) * FROM dbo.customer) A 

…您可以使用触发器或自动递增的唯一键添加类似created date的列;在ORDERBY子句中使用它……关系数据库中没有第二行和最后一行。所以没有办法得到你期望的结果。好的,我下次会做,但我现在能做的是,这个问题有很多记录,以千计。有没有办法做到这一点@Deepanshu Kalara在你的案例中,没有合乎逻辑的方法来捕捉细节。SQL Server以随机方式存储和获取数据。除非将排序与列的值联系起来,否则就没有可靠的方法获得它。我的意思是,今天当您从表中选择时,customer id=5可能看起来像是从底部开始的第二个。明天可能会有其他身份证来代替这个。除非使用ORDERBY,否则无法保证获取结果的顺序clause@CiucaS:没有这样的规则声称ID必须是顺序的,但在关系理论中可能不是随机的,甚至标准SQL也没有这样说。你的答案也是错误的,基于现有数据,无法获得预期结果。您抱怨PKirby的答案错误。顺便说一句,ROW_NUMBER是一个更好的方法,但是仍然返回错误的结果,在OP没有创建任何额外的列进行排序之前,ROW_NUMBER也将是错误的。这就是为什么我说没有办法得到预期的结果:-但是如果你在这里对苹果进行排序,你将错过所需的苹果:OP说id字段是随机的,因此,对数据进行排序是没有用的。这可能是最好的方法,因为它不使用TOP。无法使用并行化执行包含TOP关键字的查询或子查询。
LAG([MyValue],1) OVER (PARTITION BY [Category] ORDER BY [AnyColumnForOrdinal] ASC)
SELECT TOP 1 * FROM (SELECT * FROM dbo.customer
EXCEPT SELECT TOP (SELECT (COUNT(*)-2) FROM dbo.customer ) * FROM dbo.customer) A