微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle FIRST/LAST 中 KEEP 的说明

如何解决Oracle FIRST/LAST 中 KEEP 的说明

问题

请解释KEEP究竟是什么以及有/没有它的效果

正在寻找解释,但找不到明确的解释。

PARTITION BY with and without KEEP in Oracle

“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

解决方法

转述我的回答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 举报,一经查实,本站将立刻删除。