我正在尝试合并来自 2 个表的数据。
这 2 个表都包含来自同一个传感器的数据(假设一个传感器每 10 分钟测量 1 个条目的 CO2)。
第一个表包含经过验证的数据。我们称它为 station1_validated
。第二张表包含原始数据。我们称它为 station1_nrt
。
虽然原始数据表包含实时数据,但经过验证的表仅包含至少 1 个月前的数据点。 (需要一些时间来验证这些数据并在之后手动控制它,这种情况每个月只发生一次)。
我现在想做的是合并这两个表的数据以在网站上显示实时数据。然而,当验证数据可用时,它应该优先考虑该数据点而不是原始数据点。
与此相关的列是:
- timed [bigint(20)]:包含从 1.1.1970 开始以毫秒为单位的日期时间作为 unix 时间戳
- CO2 [double]:包含测得的 CO2 浓度,单位为 ppm(百万分之一)
我写了这个基本的 SQL:
SELECT
*
FROM
(SELECT
timed, CO2, '2' tab
FROM
station1_nrt
WHERE
TIMED >= 1386932400000
AND TIMED <= 1386939600000
AND TIMED NOT IN (SELECT
timed
FROM
station1_nrt
WHERE
CO2 IS NOT NULL
AND TIMED >= 1386932400000
AND TIMED <= 1386939600000) UNION SELECT
timed, CO2, '1' tab
FROM
station1_validated
WHERE
CO2 IS NOT NULL
AND TIMED >= 1386932400000
AND TIMED <= 1386939600000) a
ORDER BY timed
这不能正常工作,因为它只选择两个表都有条目的那些数据点。
但是我现在想用 JOIN
来做这件事,因为它会快得多。但是,我不知道如何使用 DISTINCT(或类似的东西)对表进行优先级排序。有人可以帮我解决这个问题(或解释一下吗?)
最佳答案
您没有提到station1_validated
中是否存在station1_nrt
中不存在的记录,所以我使用FULL JOIN
。如果 station1_validated
中的所有行都存在于 station1_nrt
中,那么您可以改用 LEFT JOIN。
像这样
SELECT IFNULL(n.timed,v.timed) as timed,
CASE WHEN v.timed IS NOT NULL THEN v.CO2 ELSE n.CO2 END as CO2,
CASE WHEN v.timed IS NOT NULL THEN '1' ELSE '2' END as tab
FROM station1_nrt as n
FULL JOIN station1_validated as v ON n.timed=v.timed AND v.CO2 IS NOT NULL
WHERE
( n.TIMED between 1386932400000 AND 1386939600000
or
v.TIMED between 1386932400000 AND 1386939600000
)
AND
(n.CO2 IS NOT NULL OR v.CO2 IS NOT NULL)
关于mysql - 将 JOIN 与 DISTINCT 结合使用并确定一张表的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20659686/