问题
请解释***KEEP***到底是什么,以及有/无它的影响。
寻找解释,但找不到明确的解释。
在Oracle中使用和不使用KEEP的PARTITION BY
"KEEP"的真正意义/功能在于对不同的列进行聚合和排序。
Keep Clause
不幸的是,当您开始搜索"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
2条答案
按热度按时间yc0p9oo01#
解释我的答案here:
这句话可以(大致)按从右到左的顺序来考虑:
ORDER BY ra.startdate
意味着在每个组内按照别名表ra
的startdate
列对行进行排序(隐含地使用ASC
结束顺序);那么KEEP (DENSE_RANK LAST
意味着对每个组内的那些有序行给出(连续的)排序(排序列具有相同值的行将被给出相同的排序),而KEEP
意味着仅对排序中为LAST
的那些行(即具有最大startdate
的行)给出排序;最后MAX(ra.address)
对于每组的剩余保留行,返回最大地址。您将从每组具有最大(最新)
startdate
的行中查找最大address
值。不使用
KEEP
子句:均值求出每组
startdate
列的最大值(最新值)。qyuhtwio2#
注意:请考虑下表表名-relation_addresses
关系标识起始日期地址邮政编码城市
1 2019年2月20日2,PVR公园879 776坦巴拉姆
1 2020年5月25日789,CV拉曼琼脂877 876 CV拉曼琼脂
2 2018年1月18日97,巴黎街角699 776 Ch main
3 2021年3月10日2/2678,公园路879 776号
4 2019年6月12日89,泰克园638 776科技园
5 2022年9月3日309,巴黎角街673 776 Ch main
5 2020年12月17日77,PVR厂房690 960 TN
1.最大(相对开始日期)开始日期-给出关系ID 1的最大开始日期(2020年5月25日)
GROUP BY ra. relation_id-根据分组依据relation_id提供输出
最终输出为
关系标识起始日期地址邮政编码城市
1 2020年5月25日789,CV拉曼琼脂877 876 CV拉曼琼脂
2 2018年1月18日97,巴黎街角699 776 Ch main
3 2021年3月10日2/2678,公园路879 776号
4 2019年6月12日89,泰克园638 776科技园
5 2020年12月17日77,PVR厂房690 960 TN