SQL如何获取分组最后一条数据_LAST_VALUE的滑动窗口陷阱
LAST_VALUE默认只返回当前行而非分组最后一条因默认窗口帧为ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW需显式指定UNBOUNDED FOLLOWING并配合确定性ORDER BY如时间降序二级排序才能正确取最新值。LAST_VALUE 默认是 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW这是最常踩的坑直接写 LAST_VALUE(col) 却发现返回的不是分组内最后一条而是当前行——因为窗口默认帧frame只包含从开头到当前行LAST_VALUE 在这个范围内当然取的是“当前行”。它不是“整个分组最后一条”而是“当前滑动窗口里最后一个”。实操建议必须显式指定窗口帧为 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING才能覆盖整组同时确保 ORDER BY 逻辑能定义出明确的“最后”顺序比如按时间戳降序再取 LAST_VALUE 才有意义如果想按业务时间取最新记录但时间有重复得加二级排序如 ORDER BY create_time DESC, id DESC否则结果不确定用 LAST_VALUE 还是 FIRST_VALUE ORDER BY 降序更稳妥很多场景下要拿分组最新一条数据其实用 FIRST_VALUE 更直观、更少出错。因为只要把排序改成降序FIRST_VALUE 天然就对应“最新”。实操建议写 FIRST_VALUE(col) OVER (PARTITION BY group_id ORDER BY update_time DESC) 比 LAST_VALUE 更不容易漏掉帧定义LAST_VALUE 在 PostgreSQL 和 SQL Server 中行为一致但在某些旧版 MySQL8.0 前不支持窗口函数别误用如果后续要过滤出每组唯一一行不是在原表上加一列FIRST_VALUE 仍需配合 ROW_NUMBER()不能只靠它真正要“获取分组最后一条记录整行”LAST_VALUE 不够用LAST_VALUE 只能逐列取值没法直接返回整行。你无法用它一次性拿到 id、name、status 等多个字段的“最后一条组合”。强行套用会导致多列 LAST_VALUE 各自计算可能来自不同行尤其当排序字段不唯一时。 arXiv Xplorer ArXiv 语义搜索引擎帮您快速轻松的查找保存和下载arXiv文章。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2514955.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!