我正在寻找有关以下任务的帮助。 我正在从 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
您可以使用
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 |