用等式查询

时间:2015-08-10 23:51:33

标签: sql oracle expression

我有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;

2 个答案:

答案 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的回答。我只是认为你应该知道不是你当前的查询正在做什么。