我需要加入两个名为MSISDN和RANGES的表。 例如:
MSISDN table:
MSISDN NETWORK
110011500 D000
110211501 D000
RANGES table:
PREFIX NETWORK DESCRIPTION
11 D000 NEOTEL
1102 D000 TELKOM
我加入为:
select *
from MSISDN a
left join RANGES b
on a.msisdn like b. prefix || '%'
and a.network = b.network;
此查询将为MSISDN'110211501'提供重复,因为它将与两个前缀匹配。 我需要避免这些重复。我只需要匹配最长的前缀(在这种情况下为'1102')。 有没有办法如何加入避免重复或后来进行重复?
答案 0 :(得分:4)
尝试以下查询:
SELECT * FROM (
SELECT
n.*,
RANK() OVER (PARTITION BY n.MSISDN ORDER BY length(n.prefix) DESC) as rnk
FROM (
SELECT *
FROM MSISDN a
LEFT JOIN RANGES b
ON a.msisdn like b. prefix || '%' and a.network = b.network
) n
)t
WHERE t.rnk = 1
它应该删除重复项,并为您提供更长前缀的记录。
答案 1 :(得分:0)
select a.*
, MAX(LENGTH(b.prefix)) AS prefix_length
from MSISDN a
left join RANGES b
on a.msisdn like b. prefix || '%'
and a.network = b.network
GROUP BY a.msisdn
, a.network