如何解决Oracle FIRST/LAST 中 KEEP 的说明
问题
请解释KEEP究竟是什么以及有/没有它的效果。
正在寻找解释,但找不到明确的解释。
PARTITION BY with and without KEEP in Oracle
“KEEP”的真正意义/威力在于您对不同的列进行聚合和排序。
不幸的是,当您开始搜索“keep”子句时,您在 Oracle 文档中找不到任何内容(希望因为这篇博文,人们现在可以参考)。当然,Oracle 记录了这些函数。您只需要知道它们在 sql 语言参考中被称为 FirsT 和 LAST。
# However,you can do even better by just adding three "keep clause" functions to the original query:
SELECT
ra.relation_id,MAX(ra.startdate) startdate,MAX(ra.address) KEEP(DENSE_RANK LAST ORDER BY ra.startdate) address,MAX(ra.postal_code) KEEP(DENSE_RANK LAST ORDER BY ra.startdate) postal_code,MAX(ra.city) KEEP(DENSE_RANK LAST ORDER BY ra.startdate) city
FROM
relation_addresses ra
WHERE
ra.startdate <= to_date(:reference_date,'yyyy-mm-dd')
GROUP BY
ra.relation_id
解决方法
转述我的回答here:
MAX(ra.address) KEEP(DENSE_RANK LAST ORDER BY ra.startdate)
可以按(大致)从右到左的顺序考虑该语句:
-
ORDER BY ra.startdate
表示按startdate
别名表的ra
列对每个组内的行进行排序(隐式使用ASC
结束顺序);然后 -
KEEP (DENSE_RANK LAST
表示对每个组中的那些有序行进行(连续)排名(对于排序列具有相同值的行将被赋予相同的排名)和KEEP
仅那些LAST
{1}} 在排名中(即startdate
最大的行);最后 -
MAX(ra.address)
对于每组剩余的保留行,返回最高工资。
您正在从每个组的最大(最新)address
行中找到最大 startdate
值。
没有 KEEP
子句:
MAX(ra.startdate)
均值查找每个组的 startdate
列的最大值(最新)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。