SQL Anywhere 12中用MAX子查询获取最大时间戳行报错求助
解决SQL Anywhere 12中取时间戳最大行的问题
别急,我来帮你搞定这个问题~你遇到的直接用MAX()筛选无效的情况,是因为聚合函数不能直接放在WHERE子句里(逻辑上WHERE是先筛选行,再做聚合计算,所以没法直接用聚合结果来筛选),下面给你几种靠谱的解决方法:
方法1:用TOP 1 + ORDER BY(最简单直接)
SQL Anywhere支持TOP语法,直接按时间戳降序排序后取第一行,就是你要的最大时间戳的行:
SELECT * FROM "eDatabase"."OrderingInfo" ORDER BY "ORD_Timestamp" DESC TOP 1;
这个方法简单高效,如果有多个行时间戳相同且都是最大值,它只会返回其中一行;如果需要返回所有最大时间戳的行,把TOP 1去掉即可。
方法2:子查询获取最大时间戳后关联
先通过子查询算出最大的时间戳,再用这个值筛选主表的行:
SELECT oi.* FROM "eDatabase"."OrderingInfo" oi WHERE oi."ORD_Timestamp" = ( SELECT MAX("ORD_Timestamp") FROM "eDatabase"."OrderingInfo" );
如果存在多个行时间戳等于最大值,这个查询会返回所有符合条件的行,适合需要保留所有最大时间戳行的场景。
方法3:窗口函数ROW_NUMBER()(灵活扩展)
SQL Anywhere 12支持窗口函数,用ROW_NUMBER()给每行按时间戳降序编号,然后取编号为1的行:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY "ORD_Timestamp" DESC) AS row_num FROM "eDatabase"."OrderingInfo" ) AS sub_query WHERE row_num = 1;
这个方法的优势是如果以后需要按某个字段分组,取每组的最大时间戳行,只要在OVER里加PARTITION BY 分组字段就行,扩展性很强。
为啥直接用MAX筛选不行?
举个例子,如果你写了这样的代码:
SELECT * FROM "eDatabase"."OrderingInfo" WHERE "ORD_Timestamp" = MAX("ORD_Timestamp");
这会报错,因为MAX()是聚合函数,它是对整个结果集计算的,而WHERE是在聚合之前筛选行,数据库没法在筛选的时候就知道聚合后的最大值,所以必须用子查询、窗口函数或者TOP排序的方式来实现。
内容的提问来源于stack exchange,提问作者user4333011
相关产品推荐
相关产品推荐

