MySQL:选择一个表的行具有相同的时间戳记或最接近于+小于另一个表的时间戳记的行

问题描述 投票:1回答:1

我有TableATable B,如下所示。当前,正如您在下面的查询中所看到的,TableA基于TableB并与box_id中的所有行相连接,这些行的TableBtimestamp TableA的1分钟内。

我想修改此查询,以便代替选择timestamp行1分钟以内的TableB行,我想选择具有TableA等效项或TableB行的timestamp行]最接近+小于timestamp中的timestamp

以下是TableATableA以及我想要的TableB的示例。一旦实现,就不再需要按Desired Table分组。任何想法/帮助将不胜感激。

TableA:

rainfall, hail, weather

TableB:

   id     box_id        timestamp       
373001645   1       2020-05-07 06:00:20 
373001695   1       2020-05-07 06:02:26
373001762   1       2020-05-07 06:05:17
373001794   1       2020-05-07 06:06:38
373001810   2       2020-05-07 06:07:21

所需表:

   id     box_id        timestamp                  data
373001345   1       2020-05-07 06:00:20     {"R": 0.114, "H": 20.808}
373001395   1       2020-05-07 06:02:26     {"R": 0.12, "H": 15.544}
373001462   1       2020-05-07 06:03:01     {"R": 0.006, "H": 55.469}
373001494   1       2020-05-07 06:04:38     {"R": 0.004, "H": 51.85}
373001496   1       2020-05-07 06:05:18     {"R": 0.02, "H": 5.8965}
373001497   1       2020-05-07 06:06:39     {"R": 0.12, "H": 54.32}
373001510   2       2020-05-07 06:07:09     {"R": 0.34, "H": 1.32}
373001511   2       2020-05-07 06:07:29     {"R": 0.56, "H": 32.7}

查询:

   id           timestamp           rainfall     hail                weather
373001345   2020-05-07 06:00:20     0.114       20.808      {"Rainfall": 0.114, "Hail": 20.808}
373001395   2020-05-07 06:02:26     0.12        15.544      {"Rainfall": 0.12, "Hail": 15.544}
373001462   2020-05-07 06:05:17     0.004       51.85       {"Rainfall": 0.004, "Hail": 51.85}
373001494   2020-05-07 06:06:38     0.02        5.8965      {"Rainfall": 0.02, "Hail": 5.8965}
373001496   2020-05-07 06:07:21     0.34        1.32        {"Rainfall": 0.34, "Hail": 1.32}
mysql json timestamp timestampdiff
1个回答
0
投票

您可以在SELECT tableA.id, tableA.timestamp AS timestamp, (tableB.data->'$.R') as rainfall, (tableB.data->'$.H') as hail, JSON_OBJECT("Hail", (tableB.data->'$.H'),"Rainfall", (tableB.data->'$.R')) AS weather FROM tableA tableA LEFT JOIN tableB tableB ON tableA.box_id = tableB.box_id AND TIMESTAMPDIFF(MINUTE, tableB.timestamp, tableA.timestamp) BETWEEN -1 AND 1 WHERE tableA.timestamp BETWEEN '2020-05-07 00:00:00' AND '2020-05-07 23:59:59' GROUP BY tableA.id,rainfall,hail,weather ORDER BY tableA.timestamp ASC; 条件下使用相关子查询,以在ON中查找最大timestamp,该最大值小于或等于tableB中的当前行时间戳,并基于此:tableA:] >

JOIN

输出:

SELECT A.id, 
       A.timestamp AS timestamp,
       B.data->'$.R' as rainfall,
       B.data->'$.H' as hail,
       JSON_OBJECT("Hail", B.data->'$.H',
                   "Rainfall", B.data->'$.R'
                  ) AS weather
FROM tableA A
LEFT JOIN tableB B ON B.box_id = A.box_id
                  AND B.timestamp = (SELECT MAX(timestamp)
                                     FROM tableB b2
                                     WHERE b2.box_id = A.box_id
                                       AND b2.timestamp <= A.timestamp)
ORDER BY A.timestamp

id timestamp rainfall hail weather 373001645 2020-05-07 06:00:20 0.114 20.808 {"Hail": 20.808, "Rainfall": 0.114} 373001695 2020-05-07 06:02:26 0.12 15.544 {"Hail": 15.544, "Rainfall": 0.12} 373001762 2020-05-07 06:05:17 0.004 51.85 {"Hail": 51.85, "Rainfall": 0.004} 373001794 2020-05-07 06:06:38 0.02 5.8965 {"Hail": 5.8965, "Rainfall": 0.02} 373001810 2020-05-07 06:07:21 0.34 1.32 {"Hail": 1.32, "Rainfall": 0.34}

© www.soinside.com 2019 - 2024. All rights reserved.