mysql - 将 JOIN 与 DISTINCT 结合使用并确定一张表的优先级

标签 mysql

我正在尝试合并来自 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/

相关文章:

mysql - 仅使用 Mysql 替换替换中所需的匹配项

MySQL,从一张表中加入两行并忽略双胞胎

mysql - 对MySQL中的多个字段进行排序

mysql - 无法运行 rake 数据库 :create segmentation fault

php - 将图像插入数据库并编码 ="multipart/form-data"

mysql - 无法修改 binlog_format 的默认参数组

php - 如何忽略 PHP 中准备好的 mysqli 查询中的参数?

python - 如何在 python 脚本中执行 "source FileName.sql"?

mysql - 如何计算没有订单的客户?

MySQL 数据透视表的列名上的日期