问题描述
问题
请解释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
列的最大值(最新)。