oracle 在计算的rnk列中查找值,减去1并从不同的列中获取值

gblwokeq  于 2022-12-03  发布在  Oracle
关注(0)|答案(2)|浏览(146)

为标题道歉。解释不清楚。
我遇到了一个问题,我不确定这里的最佳方法是什么。请参见表图片。在此数据集中,我需要在prd 2列中查找日期prd 1 date。如果找到了,我需要查看dense_rnk列减1,然后获取VAL列中的值。
例如:找到4/10,dense_rnk为4减1等于3。输出列中需要的值为Z,因为它对应于dense_rnk 3。应该由prd 1上的日期驱动。
有没有我可以在oracle中使用的excel offset可比函数?我添加了window函数,以为会有帮助,但它让一切变得更加复杂。
这可能吗?我很感激你的帮助。

6jygbczu

6jygbczu1#

这是一个两步查找,因此
1.在cte_rnk_val中创建第一个查找(dense_rnkval
1.在cte_prd2_rank中创建第二个查找(idprd2rnk
1.将所有三个连接在一起以获得输出

with cte_rnk_val as (
select dense_rnk as rnk, val from tab_secret group by 1,2),
cte_prd2_rank as (
select id, prd2, dense_rnk-1 as rnk from tab_secret group by 1,2,3)
select s.id,
       s.prd1,
       s.prd2,
       s.dense_rnk,
       s.val,
       r.val as output
  from tab_secret s
  join cte_prd2_rank p
    on s.id = p.id and s.prd1 = p.prd2
  join cte_rnk_val r
    on p.rnk = r.rnk;

输出量:

id  |prd1      |prd2      |dense_rnk|val|output|
----+----------+----------+---------+---+------+
7865|2015-04-10|2013-02-21|        1|S  |Z     |
7865|2013-07-09|2013-02-21|        1|S  |S     |
7865|2013-07-09|2013-02-21|        1|S  |S     |
7865|2015-04-10|2013-02-21|        1|S  |Z     |
7865|2015-04-10|2013-07-09|        2|Z  |Z     |
7865|2013-07-09|2013-07-09|        2|Z  |S     |
7865|2013-07-09|2014-10-10|        3|Z  |S     |
7865|2015-04-10|2014-10-10|        3|Z  |Z     |
7865|2015-04-10|2015-04-10|        4|Z  |Z     |
7865|2013-07-09|2015-04-10|        4|Z  |S     |
7865|2013-07-09|2016-10-15|        5|R  |S     |
7865|2015-04-10|2016-10-15|        5|R  |Z     |
7865|2015-04-10|2021-10-16|        6|R  |Z     |
7865|2013-07-09|2021-10-16|        6|R  |S     |

已在MySQL中测试查询。

sc4hvdpw

sc4hvdpw2#

试试这个。你可能需要翻译成Oracle,因为它是为SSMS格式化的。

SELECT e.Val
FROM (
    SELECT c.dense_rnk-1
    FROM (
        SELECT b.dense_rnk
        FROM data a INNER JOIN data b on a.prd1 = b.prd2 
    ) c
) d LEFT JOIN data e ON d.dense_rnk = e.dense_rnk

请注意,这个解决方案相当糟糕,使用原始表可能比使用提供的结果集做得更好。

相关问题