0

したがって、結合する必要のあるテーブルが2つあります。表1には、値1.5、2.5、3.5...365.5を保持するJDAYという列が含まれています。次のようになります。

JDAY
1.5
2.5
3.5
4.5
5.5
etc.

Table2と結合したいと思います。これは次のようになります。

JDAY  WSC
1     1
5     .9
8     .7
366   .5

最終結果には、Table1のすべての値を含むJDAY列と、Table2の値以下の最も近いJDAY値に対応するTable2のWSC値が含まれている必要があります。たとえば、5.5は5から8の間であるため、表1のJDAY=5.5はWSC=.9に対応します。次のようになります。

JDAY   WSC
1.5    1
2.5    1
3.5    1
4.5    1
5.5    .9
6.5    .9
7.5    .9
8.5    .7
9.5    .7
etc.
4

2 に答える 2

0

結果を取得する1つの方法は、相関サブクエリを使用することです。

更新しました

SELECT t1.JDAY
     , (SELECT t2.WSC FROM Table2 t2 
         WHERE t2.JDAY < t1.JDAY
         ORDER BY t2.JDAY DESC LIMIT 1
       ) AS WSC
  FROM Table1 t1
 ORDER BY t1.JDAY 

あなたは、JDAYよりも小さいWSCの最大値が必要だと述べました。これは、Table1行のJDAY値よりも少ないJDAY値を持つTable2の行のWSCの最大値が必要であることを意味します。これは、表示している結果セットと一致しているようです。(私がそれを間違えた場合(私が持っているかもしれません)、それは私の誤解であり、あなたが意図していなかったものを読んでいました。もしそうなら、遠慮なく私を訂正してください。)

アップデート

私はよりよく理解しています。表1のJDAY値よりも前の最大のJDAY値を持つ表2の行からのWSCの値が必要です。日付が最も早い行のWSCが必要です。私の回答のクエリは、この要件を満たすように変更されています。


基本的に同じ結果セットを取得する別の方法は、シータ結合(つまり、不等式述語の結合)を使用することです。

更新しました

SELECT t.JDAY
     , s.WSC
  FROM ( SELECT t1.JDAY
              , MAX(t2.JDAY) AS max_t2_jday
           FROM Table1 t1
           LEFT
           JOIN Table2 t2
             ON t2.JDAY < t1.JDAY
          GROUP BY t1.JDAY
          ORDER BY t1.JDAY
       ) t
  LEFT
  JOIN Table2 s
    ON s.JDAY = t.max_t2_jday

表2にJDAYの「重複」値がない限り、これは機能します。重複する値がある場合は、返される重複を排除する方法が必要になります。を追加するGROUP BY t.JDAYだけで十分ですが、決定論的ではありません。(つまり、どの行からWSC値を取得したかは保証されません。)

ここでは、Table1のすべての行と、Table2の「一致する」行を要求しています。Table2のJDAYで一致するのは、Table1のJDAYよりも少ないです。Table1の各行について、Table2からすべての「一致する」行(存在する場合)を調べ、Table2からJDAYに一致する最大のWSC値を選択し、tとしてエイリアスされたサブクエリ(インラインビュー)に返します。次に、その結​​果セットをTable2に結合して、一致する行とその行のWSC値を取得できます。

これらのクエリの違いの1つは、表1にJDAYの「重複した」値がある場合に発生し、わずかに異なる結果セットを返します。最初のクエリは、JDAYの重複値を含む、Table1のすべての行を返します。2番目のクエリは、表1からJDAYの重複する値を削除し、JDAYの個別の値のセットを返します。


アップデート:

上記の回答を更新しましたが、MAX(WSC)値は取得していませんが、代わりに、Table1JDAYよりも小さい最も近いJDAYを持つTable2の行からWSC値を取得しています。

于 2012-07-10T20:19:29.280 に答える
0

これを試しましたか?

select t1.*,t2.* from table 1 as t1
join table2 as t2
on round(t2.jday)=(t1.jday+1)
group by t1.jday
order by t1.jday;
于 2012-07-10T20:28:28.180 に答える