You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多同结构MySQL表按DATETIME关联提取对比数据的SQL语句问询

多表DATETIME匹配下的HIGH/LOW字段对比方案

嘿,这个需求其实很常见,用JOIN就能完美解决!既然所有表的DATETIME值完全一致,我们直接基于这个字段把三张表关联起来,就能把同一时间点的HIGH、LOW数据都放在同一行,方便你直观对比甚至筛选差异。

基础对比查询(查看所有时间点的全部数据)

这个SQL会把三张表同一时间点的HIGH、LOW字段都列出来,每一行对应一个时间点:

SELECT
    a.DATETIME,
    a.HIGH AS a_high,
    a.LOW AS a_low,
    b.HIGH AS b_high,
    b.LOW AS b_low,
    c.HIGH AS c_high,
    c.LOW AS c_low
FROM
    A a
INNER JOIN B b ON a.DATETIME = b.DATETIME
INNER JOIN C c ON a.DATETIME = c.DATETIME
ORDER BY
    a.DATETIME;

这里用INNER JOIN是因为你说各表的DATETIME值完全相同,所以不会有遗漏的时间点。如果之后有表可能存在缺失的时间点,可以换成LEFT JOIN来保留所有A表的时间点。

筛选有差异的记录(只看数据不一致的时间点)

如果不需要看全部数据,只想找出HIGH或LOW值存在差异的时间点,可以在查询里加WHERE条件:

SELECT
    a.DATETIME,
    a.HIGH AS a_high,
    b.HIGH AS b_high,
    c.HIGH AS c_high,
    a.LOW AS a_low,
    b.LOW AS b_low,
    c.LOW AS c_low
FROM
    A a
INNER JOIN B b ON a.DATETIME = b.DATETIME
INNER JOIN C c ON a.DATETIME = c.DATETIME
WHERE
    -- 筛选HIGH值不一致的情况
    a.HIGH != b.HIGH
    OR a.HIGH != c.HIGH
    OR b.HIGH != c.HIGH
    -- 加上LOW值不一致的情况
    OR a.LOW != b.LOW
    OR a.LOW != c.LOW
    OR b.LOW != c.LOW
ORDER BY
    a.DATETIME;

这样返回的结果里,只有那些至少一个表的HIGH或LOW和其他表不一样的时间点,能帮你快速定位差异数据。

小提醒

  • 确保所有表的DATETIME字段精度一致:比如有的表是DATETIME(不带毫秒),有的是DATETIME(3)(带毫秒),这种细微差异会导致关联失败,需要先统一格式。
  • 如果之后新增更多同结构的表,只需要继续添加INNER JOIN语句,比如INNER JOIN D d ON a.DATETIME = d.DATETIME,然后在SELECT里加上对应的字段即可。

内容的提问来源于stack exchange,提问作者LiveRock

火山引擎 最新活动