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 に答える