如何使用SQL Server读取最后一行


88

使用SQL Server读取最后一行的最有效方法是什么?

该表在唯一键上建立索引-“底部”键值代表最后一行。

Answers:


180

如果您使用的是MS SQL,则可以尝试:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
如果您在数据库中有500万条记录怎么办!:-\
2015年

4
如果表在排序列上建立了索引,则SQL只会读取表的最后一行。无需昂贵的排序或全表扫描。
Spivonious

如果我需要获取最近的1000条记录,我该如何获取
斯里兰卡

1
@Sri您将执行SELECT TOP 1000 * FROM table_name ORDER BY column_name DESC并应输出最后1000条记录。
Rod Argumedo


18

您将需要表中的某种唯一标识列,例如自动填充主键或日期时间列(最好是主键)。然后,您可以执行以下操作:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

ORDER BY column告诉它根据该列的数据,以rearange结果,并且DESC告诉它扭转结果(从而把最后一个第一)。在那之后,LIMIT 1告诉它只传回一行。


6
MSSQL不使用LIMIT
Vinko Vrsalovic

4
哇,严厉,最初的问题甚至没有特别提到SQL Server。即使SQL Server使用不同的词来描述相同的概念,上述解决方案也是完全合法的。+1
Greg Hewgill

11

如果您的一些ID是有序的,我假设您的数据库中将有一些顺序

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)


4

我认为下面的查询将在没有任何可排序列的情况下适用于具有最佳性能的SQL Server

SELECT * FROM table 
WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1 
                             FROM table) 
                        ID 
                 FROM table)

希望你了解了... :)


当您无法对DESC进行排序并且只需要返回最后一行时,这是最好的解决方案。
jjthebig1

3

我在SQl服务器2008中尝试在SQL查询中使用last,但它给出此错误消息:“'last'不是公认的内置函数名称。”

所以我最终使用了:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

获取最后一行的ID。一个人也可以使用

Declare @i int
set @i=1
select WorkflowStateStatusId from Workflow.WorkflowStateStatus
 where WorkflowStateStatusId not in (select top (
   (select count(*) from Workflow.WorkflowStateStatus) - @i ) WorkflowStateStatusId from .WorkflowStateStatus)


2

试试这个

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
作为@Vinko的上述评论,Vrsalovic说MSSQL不使用LIMIT。返回Incorrect syntax near LIMIT
frmbelz

1

为了检索MS SQL数据库2005的表的最后一行,可以使用以下查询:

select top 1 column_name from table_name order by column_name desc; 

注意:要获取MS SQL数据库2005表的第一行,可以使用以下查询:

select top 1 column_name from table_name; 

2
select top 1没有命令就不是获得第一条记录的可靠方法。如果您不按订单排序,则可以授予SQL权限以取悦您的任何记录。
代码魔术师2012年

1

OFFSETFETCH NEXT在SQL Server 2012中的功能来实现SQL分页,同时显示效果。

OFFSET参数用于确定起始行以从结果中返回行,而FETCH参数用于返回一组行数。

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY

0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)

1
最好的答案类似,我们可以从雇员那里获得第一行SELECT *,其中[雇员ID] = ALL(来自雇员的SELECT MIN([雇员ID]))
manas


0

如果您没有任何有序的列,则可以使用每行的物理ID:

SELECT top 1 sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot], 
              T.*
FROM MyTable As T
order by sys.fn_PhysLocFormatter(%%physloc%%) DESC

0

如果具有复制表,则可以在localDatabase中拥有Identity = 1000,在clientDatabase中拥有Identity = 2000,因此,如果捕获到最后一个ID,则可能总是找到来自客户端的最后一个ID,而不是来自当前连接数据库的最后一个ID。因此,返回最后一个连接的数据库的最佳方法是:

SELECT IDENT_CURRENT('tablename')

0

好吧,我没有得到表中的“最后价值”,而是得到了每种金融工具的“最后价值”。并不相同,但我认为这与某些正在寻找“现在如何完成”的人有关。我还使用了RowNumber()和CTE,在此之前,我仅采用1并按[column] desc排序。但是我们不再需要...

我正在使用SQL Server 2017,我们正在记录全球所有交易所上的所有报价,每天大约有120亿个报价,我们存储每个报价,要价和交易,包括报价的数量和属性(要价,要价,交易) )任何给定的交易所。

在该表中,任何给定合约(主要是统计数据)的253个报价数据类型,最后交易价格为tick type = 4,因此,当我们需要获取价格的“最后”时,可以使用:

select distinct T.contractId,
LAST_VALUE(t.Price)over(partition by t.ContractId order by created ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
from [dbo].[Tick] as T
where T.TickType=4

您可以在我的开发系统上看到执行计划,该计划执行效率很高,在4秒钟内执行,而交易所导入ETL将数据泵入表中,将有一些锁定使我放慢速度……这就是实时系统的工作方式。 针对85,697,659行的执行计划


-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)

欢迎来到该网站。这可能是一条评论(如果您有代表),您是否介意通过添加一些文本来扩展它,以解释它如何解决问题并将其与之前的10个答案区分开来?
gung-恢复莫妮卡2014年

-5

我很确定它是:

SELECT last(column_name) FROM table

因为我使用类似的东西:

SELECT last(id) FROM Status

7
Last()不是sql-server的函数
Taryn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.