1

私は SQL を初めて使用しますが、他のどこにも答えが見つからないようです。私は 2 つの異なるグリッド間で変換する必要があるプロジェクトに取り組んでいますが、これは Excel ではかなり簡単です。これらのフォームの 2 つのテーブルがあります (参照用に最初の数行に記入されています)。

JDAY   TL1   TL2   TL3
1.5    148.2 147.3 146.4
2.5     150.2 150.1 150.0
3.5    151.1 150.7 150.3

Layer  Elevation
2      150.9
3      149.9
4      148.9
5      147.9
6      146.9
7      145.9

Table1 の TL1、TL2、TL3 の下の値は、Table2 の Elevation 列に対応する標高です。次のようなビューを出力したい:

JDAY   TL1   TL2   TL3
1.5    5     6     7
2.5    3     3     3
3.5    2     3     3

Table1 の各値に対して、Table2 の標高よりも低い最も近いものを検索し、対応するレイヤー番号を出力する必要があります。標高が完全に一致していないため、これを行う方法がわかりません。これは、Excel の vlookup() 関数を使用してうまく機能します。もう 1 つ注意すべき点は、これはデータの一部であるということです。実際には 15 の TL 列と 365 の JDAY 値があります。

4

3 に答える 3

2

それは醜いでしょうが、次のようなことができるかもしれません:

SELECT JDAY, MAX(TL1) AS tl1, MAX(TL2) AS tl2, ...
FROM (
    SELECT JDAY, othertable.Layer AS TL1, othertable.Layer AS TL2, etc...
    FROM maintable
    INNER JOIN othertable AS tl1 ON maintable.TL1 < othertable.TL1
    INNER JOIN othertable AS tl2 ON maintable.TL2 < othertable.TL2
    etc...
) AS subquery

基本的に、内側のクエリは、他のテーブルの標高がメインテーブルの標高よりも低いすべての結合レコードを取得します。次に、他のクエリが各フィールドの MAX() を選択します。これは、探している値である必要があります。

于 2012-07-06T20:37:01.927 に答える
1

関連する行数が少ない場合、次のようにするとうまくいく可能性があります。

SELECT A.JDAY,
       (select max(layer) from table2 where elevation<=A.tl1) as tl1,
       (select max(layer) from table2 where elevation<=A.tl2) as tl2,
       (select max(layer) from table2 where elevation<=A.tl3) as tl3,
       ...
FROM table1 AS A
于 2012-07-06T20:43:34.497 に答える
0

まず、table1 はおそらく少し正規化する必要があります。

create table measurements (
  jday date not null,
  measure varchar(5) not null,
  value decimal(6,2) not null,
  primary key (jday, measure)
);

したがって、データセットは次のように表されます。

jday       measure value
2012-05-01 TL1      148.2
2012-05-01 TL2      147.3
2012-05-01 TL3      146.4
...

(あなたの JDAY 列は日付を保持していると思いますか?)

さて、あなたの質問については、MySql を使用しているため、orderby、group by、および subselects を組み合わせて、目的の結果を得ることができます。同じ結果に到達する方法は他にもありますが、これはかなり読みやすいと思います。

select * from (
  select m.*
  from measurements m
  join layers l
  where l.elevation <= m.value
  order by l.elevation desc ) x
group by jday, measure
order by jday, measure
于 2012-07-06T20:48:20.013 に答える