SQL Last() 函数
SQL: 检索最后一条记录
Section titled “SQL: 检索最后一条记录”模拟 LAST() 函数
Section titled “模拟 LAST() 函数”标准 SQL 没有直接返回列的最后一个值的 LAST() 聚合函数(aggregate function),就像 MAX() 返回最大值一样。‘最后’ 的概念通常意味着某种顺序。
要获取 ‘最后’ 一条记录或从按特定顺序排列的 ‘最后’ 一条记录中获取值,通常将排序 (ORDER BY) 与将结果集限制为一行 (LIMIT, TOP, FETCH FIRST) 的子句(clause)结合使用。
MS Access 数据库系统有一个 LAST() 函数,但这不能移植到其他 SQL 数据库,如 SQL Server, MySQL, PostgreSQL 或 Oracle。
获取最后一条记录的常用技术
Section titled “获取最后一条记录的常用技术”通用方法是根据相关列(例如,ID、时间戳)以降序(descending order)排序数据,然后从排序后的结果中选取第一行。
MySQL / PostgreSQL / SQLite 语法:
Section titled “MySQL / PostgreSQL / SQLite 语法:”SELECT column_name FROM table_name ORDER BY sort_criteria_column DESC LIMIT 1;
SQL Server 语法:
Section titled “SQL Server 语法:”SELECT TOP 1 column_name FROM table_name ORDER BY sort_criteria_column DESC;
Oracle 语法(12c 及更高版本使用 FETCH):
Section titled “Oracle 语法(12c 及更高版本使用 FETCH):”SELECT column_name FROM table_name ORDER BY sort_criteria_column DESC FETCH FIRST 1 ROW ONLY;
Oracle 语法(12c 之前版本使用 ROWNUM 和子查询):
Section titled “Oracle 语法(12c 之前版本使用 ROWNUM 和子查询):”SELECT column_name FROM ( SELECT column_name FROM table_name ORDER BY sort_criteria_column DESC ) WHERE ROWNUM = 1;
示例表上下文
Section titled “示例表上下文”在这些示例中,考虑一个 Orders 表,它包含 OrderID(一个自增主键,auto-incrementing primary key)、CustomerID、OrderDate 和 OrderAmount 等列。
示例:检索最后一条订单
Section titled “示例:检索最后一条订单”示例 (MySQL / PostgreSQL / SQLite):根据 OrderID 获取最近一条订单。
Section titled “示例 (MySQL / PostgreSQL / SQLite):根据 OrderID 获取最近一条订单。”SELECT OrderID, CustomerID, OrderDateFROM OrdersORDER BY OrderID DESCLIMIT 1;示例 (SQL Server):获取最近一条订单。
Section titled “示例 (SQL Server):获取最近一条订单。”SELECT TOP 1 OrderID, CustomerID, OrderDateFROM OrdersORDER BY OrderID DESC;示例 (Oracle 12c+):获取最近一条订单。
Section titled “示例 (Oracle 12c+):获取最近一条订单。”SELECT OrderID, CustomerID, OrderDateFROM OrdersORDER BY OrderID DESCFETCH FIRST 1 ROW ONLY;如果 ‘最后’ 指的是不同的标准,例如最新的 OrderDate(如果日期可以手动设置,这可能与 OrderID 不一致):
SELECT OrderID, CustomerID, OrderDateFROM OrdersORDER BY OrderDate DESC, OrderID DESC -- Secondary sort for ties in OrderDateLIMIT 1; -- (Syntax for MySQL/PostgreSQL)‘最后’ 的注意事项
Section titled “‘最后’ 的注意事项”定义 ‘最后’:‘最后’ 的含义至关重要。是最高的 ID,最新的日期,还是其他什么?你的 ORDER BY 子句必须反映这个定义。
并列 (Ties):如果多条记录都可以称为 ‘最后’(例如,在完全相同的最新时间戳有多个订单),上面的查询会任意选取其中一条(或基于未指定的进一步隐式排序)。如果你需要所有并列的记录,你需要使用不同的方法,可能涉及使用 MAX() 或窗口函数(window functions)的子查询。
窗口函数 (Window Functions):对于更复杂的 ‘每组最后一个值’ 的场景,SQL 窗口函数,如 LAST_VALUE()(尽管其用法可能棘手,通常更推荐使用 ROW_NUMBER())或 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ... DESC),在现代 SQL 数据库中是强大的工具。
如需进一步阅读,请搜索 ‘SQL get last record per group’ 以了解更高级的场景。