我有3个返回3个值的查询。我想加入查询以执行以下表达式:
(MgO + CaO)/SiO2
我该怎么做?
的MgO:
SELECT sampled_date, result
FROM AF_VW WHERE element = 'MgO' AND ROWNUM = 1 ORDER BY sampled_date DESC;
的CaO:
SELECT sampled_date, result
FROM AF_VW WHERE element = 'CaO' AND ROWNUM = 1 ORDER BY sampled_date DESC;
的SiO 2:
SELECT sampled_date, result
FROM AF_VW WHERE element = 'SiO2' AND ROWNUM = 1 ORDER BY sampled_date DESC;
答案 0 :(得分:2)
with x as (
SELECT sampled_date, result, element,
row_number() over(partition by element order by sampled_date desc) rn
FROM AF_VW)
, y as (
select
case when element = 'MgO' then result end as MGO,
case when element = 'CaO' then result end as CaO,
case when element = 'SiO2' then result end as SiO2
FROM x where rn = 1)
select (mgo+cao)/sio2 from y;
您可以使用row_number函数而不是rownum
,然后选择3个元素的结果。
答案 1 :(得分:0)
评论时间有点长。
您问题中的查询可能不按预期执行。 Oracle在<{em> WHERE
之前评估order by
子句。因此,以下选择MgO
的任意一行,然后按日期对一行进行简单的排序:
SELECT sampled_date, result
FROM AF_VW
WHERE element = 'MgO' AND ROWNUM = 1
ORDER BY sampled_date DESC;
实际上,要获得相同的结果,您需要模拟相同的,不稳定的逻辑。不稳定,因为如果查询多次运行,结果不能保证相同:
with mg as (
SELECT sampled_date, result
FROM AF_VW
WHERE element = 'MgO' AND ROWNUM = 1
),
coa as (
SELECT sampled_date, result
FROM AF_VW
WHERE element = 'CaO' AND ROWNUM = 1
),
sio2 as (
SELECT sampled_date, result
FROM AF_VW
WHERE element = 'SiO2' AND ROWNUM = 1
)
select (mgo.result + cao.result) / sio2.result
from mgo cross join cao cross join sio2;
我怀疑你真的想要最新的样本日期,这就是VKP的回答。我只是认为你应该知道不是你当前的查询正在做什么。