0

所以我有 2 张桌子需要加入。表 1 包含一个名为 JDAY 的列,其中包含值 1.5、2.5、3.5...365.5。看起来像:

JDAY
1.5
2.5
3.5
4.5
5.5
etc.

我想将它与 Table2 一起加入,它看起来像:

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

最终结果应该有一个 JDAY 列,其中包含 Table1 中的所有值,并且 Table2 中的 WSC 值对应于小于或等于 Table2 中的最接近的 JDAY 值。例如,表 1 中的 JDAY=5.5 对应于 WSC=.9,因为 5.5 介于 5 和 8 之间。它看起来像这样:

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

获得结果的一种方法是使用相关子查询:

更新

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 

您注意到您希望WSC 的最大值小于 JDAY;我认为这意味着您希望Table2 中 JDAY 值小于 Table1 行中 JDAY 值的行中的 WSC 最大值。这似乎与您显示的结果集相符。(如果我弄错了(我可能有),那是我的误解,阅读了一些你不打算的东西,如果是这样,请随时纠正我。)

更新

我有一个更好的理解,您希望表 2 中具有比表 1 中的 JDAY 值早的最大 JDAY 值的行中的 WSC 值。您希望 WSC 从具有最新较早日期的行中获取。我的答案中的查询已修改以满足此要求。


获得基本相同结果集的另一种方法是使用 theta-join(即,不等式谓词的连接)

更新

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 值,这将起作用。如果有重复值,您需要有一种方法来消除返回的任何重复值。添加 aGROUP BY t.JDAY就足够了,但不是确定性的。(也就是说,您无法保证从哪一行获得 WSC 值。)

在这里,我们要求 Table1 中的每一行,以及 Table2 中的任何“匹配”行,匹配 Table2 中的 JDAY 小于 Table1 中的 JDAY。对于 Table1 中的每一行,我们将翻阅 Table2 中的所有“匹配”行(如果有),我们将从 Table2 中挑选出与 JDAY 匹配的最大WSC 值,并将其返回到别名为 t 的子查询(内联视图)中。然后,我们可以将该结果集连接回 Table2,以获取匹配的行以及该行上的 WSC 值。

当表 1 中有 JDAY 的“重复”值时,这些查询之间的一个区别就会发挥作用,它们将返回略有不同的结果集。第一个查询将返回 Table1 中的所有行,包括 JDAY 的重复值。第二个查询将从表 1 中删除 JDAY 的重复值,并返回一组不同的 JDAY 值。


更新:

我已经更新了上面的答案,没有得到MAX(WSC)值,而是从 Table2 中最接近的 JDAY 小于 Table1 JDAY 的行中获取 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 回答