根据多个标准选择数据(cloest值)

时间:2014-02-19 14:20:01

标签: mysql sql

我正在使用 MySQL 。我正在尝试构建一些东西而无法找到问题的解决方案。

我正在根据lookup表从my表中选择一个值,如下例所示。
选择标准:
my.id<>l.idmy.route1=l.route1以及my.route2=l.route2my.utc=l.utc
其中my.stime is closest or same as l.stime

ex)my.id=2的col应该从l.id=1, l.etime=7777获得my.id<>l.id,其余的都是相同的。
ex)my,id=5的col从l.id=3, l.etime=9999开始有l.id=4, l.etime=7979my.id<>l.id, my.route=l.route, my.utc=l.utc个选项。然而,由于my.stime=2220 is closer to l.stime=2222l.stime=3333l.id=3, l.etime=9999将被选中 例如,my,id=6的col示例是,如果“最接近”是相同的,则选择任一值 例如,my,id=7的col示例是在不满足条件时返回NULL。

Table: lookup (l.)
id   route1   route2   utc   stime  etime
---|--------|--------|-----|-------|------
1     11        22     111   1111   7777
2     11        22     111   1111   8888
3     22        33     222   2222   9999
4     22        33     222   3333   7979
5     22        33     222   3335   8989

Table: my (my.)                      | result
id   route1   route2   utc   stime   |  l.id   l.etime    
---|--------|--------|-----|-------  |-------|----------|
2     11        22     111   1111    | 1       7777
5     22        33     222   2220    | 3       9999
6     22        33     222   3334    | 4or5    7979or8989
7     22        33     999   9999    | null    null       

应创建一个新表,其结果将附加到my的最后一个列。 任何帮助表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:0)

这个解决方案有点复杂,但它是一个起点。

首先,让我们创建一个辅助表:

CREATE TEMP TABLE temp AS
SELECT m.id mid, l.id lid, ABS(l.stime-m.stime) timediff
FROM my m JOIN lookup l
WHERE m.route1 = l.route1 AND m.route2 = l.route2 AND
      m.utc = l.utc AND m.id <> l.id;

从这张表中我们可以得到每个timediff的最低my.id

SELECT mid, min(timediff) mtimediff FROM temp GROUP BY mid

结果:

mid         mtimediff
----------  ----------
2           0         
5           2         
6           1         

现在我们可以找到lookup中哪些行有stime个差异,并选择最小的id

SELECT t.mid mid, min(lid) lid
FROM temp t JOIN (
    SELECT mid, min(timediff) mtimediff FROM temp GROUP BY mid
) mt ON t.mid = mt.mid AND t.timediff = mt.mtimediff
GROUP BY t.mid

结果如下:

mid         lid      
----------  ----------
2           1         
5           3         
6           4         

最后我们使用那些id来从表中提取数据:

SELECT m.id, m.route1, m.route2, m.utc, m.stime, l.id, l.etime
FROM my m JOIN lookup l JOIN (
    SELECT t.mid mid, min(lid) lid
    FROM temp t JOIN (
        SELECT mid, min(timediff) mtimediff FROM temp GROUP BY mid
    ) mt ON t.mid = mt.mid AND t.timediff = mt.mtimediff
    GROUP BY t.mid
) ON m.id = mid AND l.id = lid;

,并提供:

id          route1      route2      utc         stime       id          etime     
----------  ----------  ----------  ----------  ----------  ----------  ----------
2           11          22          111         1111        1           7777      
5           22          33          222         2220        3           9999      
6           22          33          222         3334        4           7979