MySQL搜索最接近的数值

时间:2012-07-06 20:27:07

标签: mysql

我是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中的Elevation列对应的高程。我想输出这样的视图:

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

我需要为表1中的每个值搜索表2中最接近的高度,并输出相应的图层编号。我不知道如何做到这一点,因为高程不完全匹配。这在Excel中使用vlookup()函数很有效。另外需要注意的是,这是一小部分数据......实际上有15个TL列和365个JDAY值。

3 个答案:

答案 0 :(得分: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(),它应该是您要查找的值。

答案 1 :(得分: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

答案 2 :(得分: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