2012-11-07 44 views
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) 
) 

回答

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行(每个位置的最大值)时,它们全部结束。

+0

非常感谢,非常感谢。看到我的后续答案,似乎也有效,但有点短(但非常相似,除非没有结束)。无论如何,无论长短,最好看到不同的解决方案。 –

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”始终是最大的每一个位置,这是有道理的考虑名称。