sql - Oracle FIRST/LAST 中 KEEP 的解释
问题描述
问题
请解释KEEP到底是什么以及有/没有它的影响。
寻找解释,但找不到明确的解释。
“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
解决方案
在这里解释我的答案:
MAX(ra.address) KEEP(DENSE_RANK LAST ORDER BY ra.startdate)
可以按(大致)从右到左的顺序考虑该语句:
ORDER BY ra.startdate
表示按别名表的startdate
列对每个组中的行进行排序(隐式使用结束顺序);然后ra
ASC
KEEP (DENSE_RANK LAST
意味着对每个组中的那些有序行进行(连续)排名(对于排序列具有相同值的行将被赋予相同的排名),并且KEEP
只有那些LAST
在排名中的行(即具有最大值的行startdate
);最后MAX(ra.address)
对于每个组的剩余保留行,返回最高工资。
您正在从每个组address
的最大值(最新)的行中找到最大值。startdate
没有KEEP
子句:
MAX(ra.startdate)
意味着找到startdate
每个组的列的最大值(最新)。
推荐阅读
- android - Android OnSharedPreferenceChangeListener 调用了 SwitchPreferenceCompat 的错误首选项值
- chilkat - Chilkat:使用来自 Microsoft 软件密钥存储提供商 (CNG) 的证书签署电子邮件
- oracle - 如何在 apex_item.date_popup 中填充 sysdate
- apache-spark - 想要通过 scala 将源(配置单元)数据插入目标,这里源列小于目标列
- java - 从 Java 应用程序访问 FUT Web 应用程序
- python-3.x - AWS Lambda SES 发送带有附件 PYTHON 的电子邮件
- scala - 如何在 scala 版本 2.13 中修复 Anorm 的未解决依赖项
- google-chrome - 如何隐藏 chrome 创建的网站应用程序标题栏
- python - 代码完成在 VS Code for OpenCV 中不起作用
- java - MongoDb比较同一集合中的两个字段,在java中