Sql 等式查询
我有3个查询返回3个值。我想加入查询以执行以下表达式:Sql 等式查询,sql,oracle,expression,Sql,Oracle,Expression,我有3个查询返回3个值。我想加入查询以执行以下表达式: (MgO + CaO)/SiO2 我该怎么做 氧化镁: 曹: 二氧化硅: 您可以使用row_number函数代替rownum,然后为3个元素选择结果 这篇评论有点长 您问题中的查询可能没有达到您预期的效果。Oracle计算order by之前的WHERE子句。因此,下面使用MgO选择任意一行,然后按日期对该行进行简单排序: SELECT sampled_date, result FROM AF_VW WHERE element = 'M
(MgO + CaO)/SiO2
我该怎么做
氧化镁:
曹:
二氧化硅:
您可以使用row_number函数代替rownum,然后为3个元素选择结果 这篇评论有点长 您问题中的查询可能没有达到您预期的效果。Oracle计算order by之前的WHERE子句。因此,下面使用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的答案所提供的。我只是认为您应该知道,您当前的查询并不是这样做的。您用Oracle标记了这个问题,但标题提到了SQL Server—您使用的是哪个数据库?我猜Oracle是基于语法的。仅供参考:在这三个示例查询中,orderby基本上没有意义。ROWNUM=1条件在对行进行排序之前进行计算,因此您将获得任意行,然后自行对其进行排序。如果您想要包含最新日期的行,您可以a使用稠密的秩函数,b使用vkp答案中的分析函数,或c使用嵌套子查询结构,内部查询中使用ORDER BY,外部查询中使用ROWNUM条件。您的问题是您的查询返回3个值。如果是这样,请使用类似的语法:从双精度中选择7+从双精度中选择4/从双精度中选择5。将括号中的查询替换为语句,然后选择result from dual。
SELECT sampled_date, result
FROM AF_VW WHERE element = 'SiO2' AND ROWNUM = 1 ORDER BY sampled_date DESC;
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;
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;