SQL 查询根据优先级值限制结果

问题描述 投票:0回答:1

我正在寻找有关以下任务的帮助。 我正在从 MY_TABLE 中选择映射表 MAP_RECRF_ASSET_TYPE 中存在 ASSET_TYPE 的记录,但我得到了重复的 TECHNICAL_ID。

为此,我在 MAP_RECRF_ASSET_TYPE 中添加了 PRIORITY 列,在结果中,我希望每个具有 MAP_RECRF_ASSET_TYPE 表中的 ASSET_TYPE 的 TECHNICAL_ID 只有一条记录,但也具有最低的 PRIORITY 值(同一列始终只有 1 条记录)优先级的值)。

我的数据库是Oracle 19c。

非常感谢帮助我完成这段代码。谢谢

我当前的查询:

with MY_TABLE as (
select '1111' as TECHNICAL_ID, 'NOTIONALCR' as ASSET_TYPE from dual union all
select '1111' as TECHNICAL_ID, '50000'      as ASSET_TYPE from dual union all
select '2222' as TECHNICAL_ID, 'FWDNOTLCR'  as ASSET_TYPE from dual union all
select '2222' as TECHNICAL_ID, '50000'      as ASSET_TYPE from dual union all
select '3333' as TECHNICAL_ID, '50000'      as ASSET_TYPE from dual union all
select '3333' as TECHNICAL_ID, 'DUMMY'      as ASSET_TYPE from dual
),

MAP_RECRF_ASSET_TYPE as (
select 'SW' as APPLICATION, 'NOTIONALCR' as ASSET_TYPE, 1 as PRIORITY from dual union all
select 'SW' as APPLICATION, 'NOTIONALDB' as ASSET_TYPE, 1 as PRIORITY from dual union all
select 'SW' as APPLICATION, 'FWDNOTLCR'  as ASSET_TYPE, 2 as PRIORITY from dual union all
select 'SW' as APPLICATION, 'FWDNOTLDR'  as ASSET_TYPE, 2 as PRIORITY from dual union all
select 'SW' as APPLICATION, 'SWOFFBALCR' as ASSET_TYPE, 2 as PRIORITY from dual union all
select 'SW' as APPLICATION, 'SWOFFBALDR' as ASSET_TYPE, 2 as PRIORITY from dual union all
select 'SW' as APPLICATION, 'SWFWNOTLCR' as ASSET_TYPE, 2 as PRIORITY from dual union all
select 'SW' as APPLICATION, 'SWFWNOTLDB' as ASSET_TYPE, 2 as PRIORITY from dual union all
select 'SW' as APPLICATION, '50000'      as ASSET_TYPE, 3 as PRIORITY from dual
)
                SELECT *
                FROM MY_TABLE x
                WHERE
                    x.ASSET_TYPE IN (
                        SELECT ASSET_TYPE
                        FROM MAP_RECRF_ASSET_TYPE
                        WHERE APPLICATION = 'SW');

-- 当前结果:

TECHNICAL_ID    ASSET_TYPE
1111    NOTIONALCR
1111    50000
2222    FWDNOTLCR
2222    50000
3333    50000

-- 预期结果:

TECHNICAL_ID    ASSET_TYPE
1111    NOTIONALCR
2222    FWDNOTLCR
3333    50000
sql oracle greatest-n-per-group oracle19c
1个回答
0
投票

您可以使用

INNER JOIN 
,然后使用
ROW_NUMBER
分析函数来查找每个
technical_id
的最低优先级:

with MY_TABLE (technical_id, asset_type) as (
select '1111', 'NOTIONALCR' from dual union all
select '1111', '50000'      from dual union all
select '2222', 'FWDNOTLCR'  from dual union all
select '2222', '50000'      from dual union all
select '3333', '50000'      from dual union all
select '3333', 'DUMMY'      from dual
),
MAP_RECRF_ASSET_TYPE (application, asset_type, priority) as (
select 'SW', 'NOTIONALCR', 1 from dual union all
select 'SW', 'NOTIONALDB', 1 from dual union all
select 'SW', 'FWDNOTLCR' , 2 from dual union all
select 'SW', 'FWDNOTLDR' , 2 from dual union all
select 'SW', 'SWOFFBALCR', 2 from dual union all
select 'SW', 'SWOFFBALDR', 2 from dual union all
select 'SW', 'SWFWNOTLCR', 2 from dual union all
select 'SW', 'SWFWNOTLDB', 2 from dual union all
select 'SW', '50000'     , 3 from dual
)
SELECT technical_id, asset_type
FROM   (
  SELECT t.technical_id,
         t.asset_type,
         ROW_NUMBER() OVER (
           PARTITION BY t.technical_id
           ORDER BY a.priority
         ) AS rn
  FROM   MY_TABLE t
         INNER JOIN MAP_RECRF_ASSET_TYPE a
         ON t.asset_type = a.asset_type
  WHERE  a.application = 'SW'
)
WHERE  rn = 1;

哪个输出:

技术_ID 资产类型
1111 名义CR
2222 FWD 不 TLCR
3333 50000

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.