我是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值。
答案 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