0

私は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 の行が必要です。私はこれが簡単であることを知っていますが、初心者にはうまくいきません。(ポストグルで)

4

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

この意志:

  1. 外積 またはr1および を作成しますr2( と のすべての可能な組み合わせを取得しr1.mますr2.m)
  2. 関数を計算fします(私の場合sin(r1.m*r2.m)、例として使用しました)
  3. r1との組み合わせごとにランクを計算するr2
  4. ランク = 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 onr1.nameから計算された最初の 1つだけを返します。order by

于 2013-09-16T12:27:28.123 に答える