【发布时间】:2010-09-15 16:39:15
【问题描述】:
使用 SQL Server 读取最后一行的最有效方法是什么?
该表以唯一键为索引——“底部”键值代表最后一行。
【问题讨论】:
标签: sql sql-server
使用 SQL Server 读取最后一行的最有效方法是什么?
该表以唯一键为索引——“底部”键值代表最后一行。
【问题讨论】:
标签: sql sql-server
如果您使用的是 MS SQL,可以尝试:
SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC
【讨论】:
SELECT TOP 1000 * FROM table_name ORDER BY column_name DESC 并且应该输出最后1000条记录。
select whatever,columns,you,want from mytable
where mykey=(select max(mykey) from mytable);
【讨论】:
mykey 是你的表索引
mykey 是唯一标识符,则此方法无济于事
您需要在表中使用某种唯一标识列,例如自动填充主键或日期时间列(最好是主键)。然后你可以这样做:
SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1
ORDER BY column 告诉它根据该列的数据重新排列结果,DESC 告诉它反转结果(因此将最后一个放在第一位)。之后,LIMIT 1 告诉它只传回一行。
【讨论】:
如果你的一些 id 是有序的,我假设你的 db 中会有一些订单
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
【讨论】:
我认为下面的查询将适用于 SQL Server,在没有任何可排序列的情况下具有最高性能
SELECT * FROM table
WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1
FROM table)
ID
FROM table)
希望你已经理解了... :)
【讨论】:
我尝试在 SQl server 2008 中使用 last in sql 查询,但它给出了这个错误: " '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)
【讨论】:
你可以使用last_value:SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...
我在我的一个数据库中对其进行了测试,它按预期工作。
您也可以在此处查看文档:https://msdn.microsoft.com/en-us/library/hh231517.aspx
【讨论】:
OFFSET 和FETCH NEXT 是 SQL Server 2012 的一个功能,可以在显示结果的同时实现 SQL 分页。
OFFSET 参数用于决定从结果中返回行的起始行,FETCH 参数用于返回一组行数。
SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY
【讨论】:
为了检索 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;
【讨论】:
select top 1 没有 order by 不是获得第一条记录的可靠方法。如果您不按顺序下订单,则表示您允许 SQL 为您提供任何它喜欢的记录。
如果没有有序列,可以使用每一行的物理id:
SELECT top 1 sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot],
T.*
FROM MyTable As T
order by sys.fn_PhysLocFormatter(%%physloc%%) DESC
【讨论】:
试试这个
SELECT id from comission_fees ORDER BY id DESC LIMIT 1
【讨论】:
LIMIT。这将返回 Incorrect syntax near LIMIT
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)
【讨论】:
这是获取最后一条记录并更新 Access DB 中的字段的方式。
更新 compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )
【讨论】:
如果您有一个 Replicated 表,则可以在 localDatabase 中拥有 Identity=1000,在 clientDatabase 中拥有 Identity=2000,因此如果您捕获最后一个 ID,您可能会发现总是来自客户端的最后一个 ID,而不是来自当前连接的最后一个数据库。 所以返回最后连接的数据库的最佳方法是:
SELECT IDENT_CURRENT('tablename')
【讨论】:
好吧,我没有得到表格中的“最后一个值”,我得到的是每个金融工具的最后一个值。它不一样,但我想这与一些正在寻找“现在如何完成”的人相关。我还使用了 RowNumber() 和 CTE,在此之前只取 1 并按 [column] desc 排序。但是我们不再需要...
我正在使用 SQL Server 2017,我们正在记录全球所有交易所的所有报价,我们每天有大约 120 亿个报价,我们存储每个买价、卖价和交易,包括交易量和报价属性(买价、询问,交易)任何给定的交易所。
对于该表中的任何给定合约(主要是统计数据),我们有 253 种类型的分时数据,最后交易价格为分时类型 = 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 正在将数据泵入表中,会有一些锁定让我慢下来......这就是实时系统的方式工作。
【讨论】:
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
【讨论】:
我很确定它是:
SELECT last(column_name) FROM table
因为我使用了类似的东西:
SELECT last(id) FROM Status
【讨论】: