私はSQLとpostgresに比較的慣れていません。R1 と R2 をいくつかの列で関連付けました。それぞれが R1.m と R2.m などの測定値です。ここで、 R1 のすべての行について、 (R1.m and R2.m) の関数 f の最小値を見つける必要があるf(R1.m,R2.m)
ため、コードは次のようになりselect R1.name, R2.name from R1,R2 where f(R1.m,R2.m) < .......
ます。このクエリを埋めることができません。関数を最小化する R1 のすべての行に R2 の行が必要です。私はこれが簡単であることを知っていますが、初心者にはうまくいきません。(ポストグルで)
2 に答える
0
あなたの質問を正しく理解しているかどうかわからないので、次のようなことを試してください:
with
r1 as (select generate_series(1,10,1) as m)
,r2 as (select generate_series(10,20,1) as m)
,cte as (
select
r1.m as "r1.m",
r2.m as "r2.m",
sin(r1.m * r2.m) f_r1r2,
dense_rank() over (partition by r1.m order by sin(r1.m * r2.m)) as f_r1r2_rank
from
r1,
r2
)
select
*
from
cte
where
f_r1r2_rank = 1
この意志:
- 外積 または
r1
および を作成しますr2
( と のすべての可能な組み合わせを取得しr1.m
ますr2.m
) - 関数を計算
f
します(私の場合sin(r1.m*r2.m)
、例として使用しました) r1
との組み合わせごとにランクを計算するr2
- ランク = 1 (最小) のものだけを選択する
言い換えれば、これは「与えられたr2.m
最小限の関数を取得するには何を使用すればよいですか?」という質問に答えます。f(r1.m,r2.m)
r1.m
サンプル データが提供されていないため、独自のデータを生成しました。それを機能させるには、次のようなものを使用する必要があります。
with
cte as (
select
r1.m as "r1.m",
r2.m as "r2.m",
sin(r1.m * r2.m) f_r1r2,
dense_rank() over (partition by r1.m order by sin(r1.m * r2.m)) as f_r1r2_rank
from
r1,
r2
)
select
*
from
cte
where
f_r1r2_rank = 1
もちろん、sin(r1.m * r2.m)
独自の関数に置き換える必要があります。
于 2013-09-16T10:35:25.067 に答える
0
わかったら
select distinct on (r1.name)
r1.name, r2.name, f(r1.m, r2.m)
from r1 cross join r2
order by r1.name, f(r1.m, r2.m)
distinct on
句r1.name
から計算された最初の 1つだけを返します。order by
于 2013-09-16T12:27:28.123 に答える