真的为此苦苦挣扎,我不知道为什么。我的桌子看起来像这样:
FundID BenchmarkID BenchmarkType StartDate EndDate
A 1 Primary 2018-06-01 NULL
A 2 Reporting 1 2018-06-01 NULL
B 1 Primary 2018-07-01 NULL
C 2 Primary 2018-06-01 NULL
C 1 Reporting 1 2018-06-01 NULL
我想做的是仅选择BenchmarkType为“ Reporting 1”的记录,但是如果没有Reporting 1记录,则选择“ Primary” BenchmarkType。我还需要将其用作连接其他表的一部分,并且它必须高效。
到目前为止,我的代码如下,并且我尝试过配合COALESCE,但是它不起作用,因为我说过我需要能够将此作为select的一部分,并可能在其他查询中用作加入:
SELECT * FROM Benchmark
WHERE BenchmarkType = COALESCE(CASE WHEN BenchmarkType = 'Reporting 1' OR BenchmarkType = 'Primary' THEN 'Reporting 1' ELSE NULL END,'Primary')
AND EndDate IS NULL
任何帮助将不胜感激。
谢谢
答案 0 :(得分:2)
这是一个优先级查询。如果只有这两种类型可用,那么union all
就足够简单了:
select b.*
from Benchmark b
where BenchmarkType = 'Reporting 1'
union all
select b.*
from Benchmark b
where BenchmarkType = 'Primary' and
not exists (select 1 from Benchmark b2 where b2.fundId = b.fundId and b2.BenchmarkType = 'Reporting 1');
答案 1 :(得分:0)
为什么不将row_number()
函数与top (1) with ties
一起使用? :
select top (1) with ties b.*
from Benchmark b
order by row_number() over (partition by FundID
order by (case when BenchmarkType = 'Reporting 1'
then 1
when BenchmarkType = 'Primary'
then 2
end)
);
答案 2 :(得分:0)
在一个选择查询中实现:
select *
from Funds a
where BenchmarkType = 'Reporting 1'
OR
( benchmarktype = 'Primary' and fundid not in (select fundid from funds where benchmarktype = 'Reporting 1'))