我有下表,我希望得到所需的结果集,基于:
现有表格:
TICKER | EXCHANGE | COUNTRY -------+----------+-------- 123 CS | HKE | HK 123 C1 | SGX | SG 124 CG | LSE | GB 124 C2 | NYE | US 125 CS | NAS | US 125 C1 | SGX | SG 126 C1 | KUL | MY
期望的结果集:
TICKER | EXCHANGE | COUNTRY -------+----------+-------- 123 CS | HKE | HK 123 C1 | SGX | SG 124 CG | LSE | GB 124 C2 | NYE | US 125 CS | NAS | US 125 C1 | SGX | SG
感谢您对如何使用“C1 / C2自动收录器”找到完全匹配的帮助,以便返回该对?
谢谢
答案 0 :(得分:1)
一种解决方案是使用COUNT OVER
:
select ticker, exchange, country
from
(
select
ticker, exchange, country,
count(*) over (partition by
regexp_substr(ticker, '^[^ ]+'),
case when ticker like '%C1'
or ticker like '%CS' then 'C1' else 'C2' end
) as cnt
from tickers
where ticker like '%C1'
or ticker like '%C2'
or ticker like '%CG'
or ticker like '%CS'
)
where cnt > 1
order by ticker;
内部WHERE
子句可以用更优雅的
regexp_like(ticker, '.*C[12GS]$')
顺便说一句,如果您愿意的话。
CASE
表达式可以替换为
case when regexp_substr(ticker, '[^ ]+$') in ('C1', 'CS') then 'C1' else 'C2' end
或
case when regexp_like(ticker, '.*C[12]$') then 'C1' else 'C2' end
如评论中所述,您可能更愿意更改表格设计,例如将股票代码值分开。如果您不允许这样做,您仍然可以使用regexp_substr(ticker, '^[^ ]+')
和regexp_substr(ticker, '[^ ]+$')
创建一个视图,并使用它来方便使用。