【问题标题】:How to read the last row with SQL Server如何使用 SQL Server 读取最后一行
【发布时间】:2010-09-15 16:39:15
【问题描述】:

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

该表以唯一键为索引——“底部”键值代表最后一行。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

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

    SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 
    

    【讨论】:

    • 如果数据库中有 500 万条记录怎么办! :-\
    • 如果表在排序列上被索引,那么 SQL 将只读取表的最后一行。不需要昂贵的排序或全表扫描。
    • 如果我需要获取最后 1000 条记录,我该如何获取,您能告诉我
    • @Sri 你会执行SELECT TOP 1000 * FROM table_name ORDER BY column_name DESC 并且应该输出最后1000条记录。
    【解决方案2】:
    select whatever,columns,you,want from mytable
     where mykey=(select max(mykey) from mytable);
    

    【讨论】:

    • 什么是mykey?在我的情况下?
    • @Mowgli mykey 是你的表索引
    • 如果 mykey 是唯一标识符,则此方法无济于事
    【解决方案3】:

    您需要在表中使用某种唯一标识列,例如自动填充主键或日期时间列(最好是主键)。然后你可以这样做:

    SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

    ORDER BY column 告诉它根据该列的数据重新排列结果,DESC 告诉它反转结果(因此将最后一个放在第一位)。之后,LIMIT 1 告诉它只传回一行。

    【讨论】:

    • 哇,苛刻,原来的问题甚至没有具体说SQL Server。即使 SQL Server 使用不同的词来描述相同的概念,上述解决方案也是完全合法的。 +1
    • @VinkoVrsalovic 这并不意味着答案是无用的,即使十年后也是如此。先生,你同意我的观点吗?
    • 这是书面交流的问题 - 阅读起来比预期的要严厉得多,尤其是简短的时候!我现在知道了,我知道作者有责任。所以,如果我今天要写这个,我会说:“这就是想法,尽管您需要对 SQL Server 使用 TOP 而不是 LIMIT,因为那是问题中标记的 DMBS 引擎。请参阅docs.microsoft.com/en-us/sql/t-sql/queries/…”@ snr
    【解决方案4】:

    如果你的一些 id 是有序的,我假设你的 db 中会有一些订单

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

    【讨论】:

      【解决方案5】:

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

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

      希望你已经理解了... :)

      【讨论】:

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

      我尝试在 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)
      

      【讨论】:

        【解决方案7】:

        你可以使用last_value:SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...

        我在我的一个数据库中对其进行了测试,它按预期工作。

        您也可以在此处查看文档:https://msdn.microsoft.com/en-us/library/hh231517.aspx

        【讨论】:

          【解决方案8】:

          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
          

          【讨论】:

            【解决方案9】:

            为了检索 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 为您提供任何它喜欢的记录。
            【解决方案10】:

            如果没有有序列,可以使用每一行的物理id:

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

            【讨论】:

            • 这对于抽象来说是一个非常好的答案,因为关键字段可能不知道甚至可能不存在。但是,%%physloc%% 是升序的,并且按格式化字段排序会导致错误,例如(1:2:30) 看起来小于 (1:2:4)。建议更改查询以删除格式化程序,而是直接使用 %%physloc%%,例如---- 按 %%physloc%% desc 排序----
            【解决方案11】:

            试试这个

            SELECT id from comission_fees ORDER BY id DESC LIMIT 1
            

            【讨论】:

            • 正如@Vinko Vrsalovic 上面的评论所说,MSSQL 不使用LIMIT。这将返回 Incorrect syntax near LIMIT
            【解决方案12】:
            SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)
            

            【讨论】:

            • 最佳答案类似地我们可以得到第一行 SELECT * from Employees where [Employee ID] = ALL (SELECT MIN([Employee ID]) from Employees)
            【解决方案13】:

            这是获取最后一条记录并更新 Access DB 中的字段的方式。

            更新 compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )

            【讨论】:

              【解决方案14】:

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

              SELECT IDENT_CURRENT('tablename')
              

              【讨论】:

                【解决方案15】:

                好吧,我没有得到表格中的“最后一个值”,我得到的是每个金融工具的最后一个值。它不一样,但我想这与一些正在寻找“现在如何完成”的人相关。我还使用了 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 正在将数据泵入表中,会有一些锁定让我慢下来......这就是实时系统的方式工作。

                【讨论】:

                  【解决方案16】:
                  SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
                  

                  【讨论】:

                  • 欢迎来到本站。这可能是一条评论(如果您有代表),您是否介意通过添加一些文本来扩展它以解释它如何解决问题并将其与前面的 10 个答案区分开来?
                  【解决方案17】:

                  我很确定它是:

                  SELECT last(column_name) FROM table
                  

                  因为我使用了类似的东西:

                  SELECT last(id) FROM Status
                  

                  【讨论】:

                  • Last() 不是 sql-server 的函数
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-03-09
                  • 2011-09-02
                  • 2012-10-31
                  • 1970-01-01
                  • 2022-06-15
                  相关资源
                  最近更新 更多