首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL上的多重公式

PostgreSQL上的多重公式
EN

Stack Overflow用户
提问于 2014-04-01 10:03:13
回答 2查看 220关注 0票数 0

我的数据是这样

代码语言:javascript
复制
wavelength    reflectance
341.6         2.48
343.1         2.43
344.7         2.37
346.3         2.32
347.9         2.29
349.5         2.26
351.1         2.23
352.6         2.24
354.2         2.25
355.8         2.29
357.4         2.28
358.9         2.23
360.5         2.22
362.1         2.18
363.6         2.16
365.2         2.14

我想用这个公式

  • 选择波长340-345之间的反射率,并将所有反射率值相加为r。
  • 选择波长350-355之间的反射率,并将所有反射率值相加,然后添加值为i。
  • 选择波长360-365之间的反射率,并将所有反射率值相加为n。

公式是

代码语言:javascript
复制
2.5*((r-i)/(r+(6*i)-(7.5*n)+1))
  • 产值应命名为tera

预期产出

代码语言:javascript
复制
tera
-2.33333

公式是

代码语言:javascript
复制
(r-(2*i)-n)/(r+(2*i)-n)
  • 输出应该被命名为tera

预期产出

代码语言:javascript
复制
tera
-0.89831

对独立公式的单独查询。在PostgreSQL中可以应用这样的公式吗?像这样..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-01 10:31:33

SQLFiddle

代码语言:javascript
复制
select
  2.5*((r-i)/(r+(6*i)-(7.5*n)+1)) as tera,
  (r-(2*i)-n)/(r+(2*i)-n) as tera2
from
  (
  select
    sum(case when wavelength between 340 and 345 then reflectance end) as r,
    sum(case when wavelength between 350 and 355 then reflectance end) as i,
    sum(case when wavelength between 360 and 365 then reflectance end) as n
  from
    test
  ) vars

对于多个表,可以使用以下内容:

代码语言:javascript
复制
select
  table_name,
  2.5*((r-i)/(r+(6*i)-(7.5*n)+1)) as tera,
  (r-(2*i)-n)/(r+(2*i)-n) as tera2
from
  (
  select
    table_name,
    sum(case when wavelength between 340 and 345 then reflectance end) as r,
    sum(case when wavelength between 350 and 355 then reflectance end) as i,
    sum(case when wavelength between 360 and 365 then reflectance end) as n
  from
    (
      select 'table 1' as table_name, * from test
      union all
      select 'table 2', * from test
      union all
      select 'table 3', * from test      
      union all
      select 'table 4', * from test  
    ) as all_tables
  group by
    table_name
  ) vars

SQLFiddle

您只需将表名修改为实际名称,并根据需要重复多次union all

票数 1
EN

Stack Overflow用户

发布于 2014-04-01 10:27:41

我有个建议给你。我已经将公式添加到相同的查询中。如果需要在单独的语句中使用它们,那么只需将公式转到两个查询中。

代码语言:javascript
复制
SELECT
    2.5*((r-i)/(r+(6*i)-(7.5*n)+1)) AS tera,
    (r-(2*i)-n)/(r+(2*i)-n) AS tera2
FROM
(
    SELECT
        SUM(CASE WHEN tbl.wavelength BETWEEN 340 AND 345 THEN tbl.reflectance ELSE 0 END) AS r,
        SUM(CASE WHEN tbl.wavelength BETWEEN 350 AND 355 THEN tbl.reflectance ELSE 0 END) AS i,
        SUM(CASE WHEN tbl.wavelength BETWEEN 360 AND 365 THEN tbl.reflectance ELSE 0 END) AS n
    FROM
        table1 as tbl
) as outertbl

输出将是

代码语言:javascript
复制
tera                tera2
-2.33333333333335   -0.898305084745763
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22782600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档