首页 > 解决方案 > Oracle FIRST/LAST 中 KEEP 的解释

问题描述

问题

请解释KEEP到底是什么以及有/没有它的影响。

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

在 Oracle 中使用和不使用 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

标签: sqloracle

解决方案


在这里解释我的答案:

MAX(ra.address) KEEP(DENSE_RANK LAST ORDER BY ra.startdate)

可以按(大致)从右到左的顺序考虑该语句:

  • ORDER BY ra.startdate表示按别名表的startdate列对每个组中的行进行排序(隐式使用结束顺序);然后raASC
  • KEEP (DENSE_RANK LAST意味着对每个组中的那些有序行进行(连续)排名(对于排序列具有相同值的行将被赋予相同的排名),并且KEEP只有那些LAST在排名中的行(即具有最大值的行startdate);最后
  • MAX(ra.address)对于每个组的剩余保留行,返回最高工资。

您正在从每个组address的最大值(最新)的行中找到最大值。startdate


没有KEEP子句:

MAX(ra.startdate)

意味着找到startdate每个组的列的最大值(最新)。


推荐阅读