Oracle FIRST/LAST中KEEP的解释

hivapdat  于 2023-01-25  发布在  Oracle
关注(0)|答案(2)|浏览(127)

问题

请解释***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
yc0p9oo0

yc0p9oo01#

解释我的答案here

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

这句话可以(大致)按从右到左的顺序来考虑:

  • ORDER BY ra.startdate意味着在每个组内按照别名表rastartdate列对行进行排序(隐含地使用ASC结束顺序);那么
  • KEEP (DENSE_RANK LAST意味着对每个组内的那些有序行给出(连续的)排序(排序列具有相同值的行将被给出相同的排序),而KEEP意味着仅对排序中为LAST的那些行(即具有最大startdate的行)给出排序;最后
  • MAX(ra.address)对于每组的剩余保留行,返回最大地址。

您将从每组具有最大(最新)startdate的行中查找最大address值。
不使用KEEP子句:

MAX(ra.startdate)

均值求出每组startdate列的最大值(最新值)。

qyuhtwio

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. ra. relation_id-给出相应的relation_id。例如1
    1.最大(相对开始日期)开始日期-给出关系ID 1的最大开始日期(2020年5月25日)
  • MAX(原始地址)KEEP(DENSE_RANK最后订单按原始开始日期排序)地址-
  • ORDER BY ra. startdate-按升序排列开始日期(2019年2月20日、2020年5月25日)
  • DENSE_RANK LAST-给出最后开始日期(最大开始日期)-(2020年5月25日)
  • MAX(原始地址)KEEP(DENSE_RANK LAST ORDER BY原始开始日期)MAX(原始地址)KEEP(2020年5月25日)-相应开始日期的地址-789,CV Raman nagar
  • MAX(原始邮政编码)KEEP(按原始开始日期排列最后订单)邮政编码-
  • ORDER BY ra. startdate-按升序排列开始日期(2019年2月20日、2020年5月25日)
  • DENSE_RANK LAST-给出最后开始日期(最大开始日期)-(2020年5月25日)
  • 最大值(原始邮政编码)保留(DENSE_RANK LAST ORDER BY原始开始日期)最大值(原始地址)保留(2020年5月25日)-相应开始日期的地址-877 876
  • MAX(ra.city)KEEP(DENSE_RANK最后一个订单按ra.startdate)城市-
  • ORDER BY ra. startdate-按升序排列开始日期(2019年2月20日、2020年5月25日)
  • DENSE_RANK LAST-给出最后开始日期(最大开始日期)-(2020年5月25日)
  • MAX(ra. city)KEEP(DENSE_RANK LAST ORDER BY ra. startdate)MAX(ra. address)KEEP(2020年5月25日)-相应开始日期的地址-CV拉曼纳加尔

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

相关问题