1

我是 SQL 新手,我似乎无法在其他任何地方找到答案。我正在做一个项目,该项目需要我在两个不同的网格之间进行转换,这在 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

在表 1 中,TL1、TL2、TL3 下的值是与表 2 中的高程列相对应的高程。我想输出这样的视图:

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

我需要为 Table1 中的每个值在 Table2 中搜索最接近的小于高程,并输出相应的图层编号。我不确定如何执行此操作,因为海拔不完全匹配。这在 Excel 中使用 vlookup() 函数效果很好。另一件需要注意的是,这只是一小部分数据……实际上有 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 回答