0

postgres 9.2 中的这个查询:

select max(amount) as max_analyte,concat(sarea,' ',sloc) as location,analyte
from sample natural join station
group by analyte,location
order by max_analyte desc;

返回以下结果:

max_analyte;location;analyte
24196;"CANDLESTICK POINT WINDSURFER CIRCLE";"COLI_TOTAL  "
19863;"CHINA BEACH/BAKER BEACH LOBOS CREEK";"COLI_TOTAL  "
14136;"CRISSY FIELD EAST";"COLI_TOTAL  "
12033;"CHINA BEACH/BAKER BEACH BAKER BEACH WEST";"COLI_TOTAL  "
4352;"CHINA BEACH/BAKER BEACH LOBOS CREEK";"COLI_E      "
3076;"CHINA BEACH/BAKER BEACH BACKER BEACH EAST";"COLI_TOTAL  "
2851;"CHINA BEACH/BAKER BEACH LOBOS CREEK";"ENTERO      "
2064;"AQUATIC PARK SHORELINE";"COLI_TOTAL  "
1918;"CRISSY FIELD EAST";"ENTERO      "
...
...

74;"CHINA BEACH/BAKER BEACH CHINA BEACH";"ENTERO      "
41;"CRISSY FIELD WEST";"ENTERO      "
41;"OCEAN BEACH NORTH LINCOLN WAY";"ENTERO      "
31;"OCEAN BEACH NORTH LINCOLN WAY";"COLI_E      "

该数据集包含在许多不同日期在湾区周围不同地点采样的 3 种细菌(COLI_TOTAL、COLI_E、ENTERO)的水平。上面的查询找到了每种细菌在每个位置的最大值,但现在我想找到与每个位置的最大值相关联的细菌类型。我只是不确定如何编写该查询。我应该提到我这样做是为了提高我的 SQL 技能。感谢您的任何帮助/建议。

表模式如下:

CREATE TABLE sample
(
  analyte character(12),
  amount integer,
  sdate date,
  sid character varying(20)
)

CREATE TABLE station
(
  sid character(20),
  sarea character varying(24),
  sloc character varying(24),
  sfreq character varying(24)
)
4

2 回答 2

1

这有点复杂,但这是一个可行的解决方案:

with cte as (
select max(amount) as max_analyte,
       concat(sarea,' ',sloc) as location,
       analyte
from sample natural join station
group by analyte,location
)
select location, analyte, max_analyte
from (
  select location, analyte, max_analyte,
         row_number() over (partition by location order by max_analyte desc) rn
  from cte
) A
where rn = 1;

with cte部分基本上将您之前的查询包装起来,以便以后可以再次使用它,cte就像它只是另一个表一样引用它(这称为公共表表达式)。然后在子查询中使用该 CTE,该子查询对每个位置从 1 开始的行进行编号。后面括号中的查询部分over告诉row_number()如何对它编号的行进行排序以及何时从 1 重新开始。最后,当我们抓取第 1 行(每个位置的最大值)时,它就全部结束了。

于 2012-11-07T21:44:23.263 回答
0

我想我有一个可行的解决方案:

select distinct concat(sarea,' ',sloc), analyte, amount from 
    (sample natural join station) as t1 
    join
    (
        select sid,max(amount) as max_amount from 
        sample group by sid
    ) as t2 
    on t1.sid=t2.sid and t1.amount=t2.max_amount
    order by amount desc;

"CANDLESTICK POINT WINDSURFER CIRCLE";"COLI_TOTAL  ";24196
"CHINA BEACH/BAKER BEACH LOBOS CREEK";"COLI_TOTAL  ";19863
"CRISSY FIELD EAST";"COLI_TOTAL  ";14136
"CHINA BEACH/BAKER BEACH BAKER BEACH WEST";"COLI_TOTAL  ";12033
"CHINA BEACH/BAKER BEACH BACKER BEACH EAST";"COLI_TOTAL  ";3076
"AQUATIC PARK SHORELINE";"COLI_TOTAL  ";2064
"CANDLESTICK POINT SUNNYDALE COVE";"COLI_TOTAL  ";1723
"CANDLESTICK POINT JACKRABBIT BEACH";"COLI_TOTAL  ";1529
"AQUATIC PARK HYDE STREET PIER";"COLI_TOTAL  ";933
"CRISSY FIELD WEST";"COLI_TOTAL  ";884
"OCEAN BEACH NORTH BALBOA STREET";"COLI_TOTAL  ";789
"OCEAN BEACH SOUTH SLOAT";"COLI_TOTAL  ";771
"OCEAN BEACH NORTH LINCOLN WAY";"COLI_TOTAL  ";563
"CHINA BEACH/BAKER BEACH CHINA BEACH";"COLI_TOTAL  ";328

看起来“COLI_TOTAL”始终是每个位置的最大值,考虑到名称,这是有道理的。

于 2012-11-07T22:26:06.333 回答