mysql - 如何加入子查询的 self 加入?

标签 mysql sql

数据:

create table `values` (
     id integer unsigned primary key auto_increment,
     value double,
     `time` time
);

insert into `values` (time, value) values
  ('00:00:01', 1),
  ('00:00:02', 2),
  ('00:00:03', 3),
  ('00:01:01', 4),
  ('00:01:02', 5),
  ('00:01:03', 6);

和 fiddle 一样 http://sqlfiddle.com/#!9/ec3e8/1

SELECT
    vs1.time as t1,
    vs1.value as v1,
    vs2.time as t2,
    vs2.value as v2
FROM `values` vs1, `values` vs2
JOIN (
    SELECT MIN(time) as mint, MAX(time) as maxt FROM `values`
    GROUP BY hour(time), minute(time)
) as te on vs1.time = te.mint AND vs2.time = te.maxt
WHERE vs1.id != vs2.id AND hour(vs1.time) = hour(vs2.time) AND minute(vs1.time) = minute(vs2.time)

我在 mysql 中有一个时间序列数据。我想用一个 sql 查询从中汇总一些统计数据。我想按时间对值进行分组,然后从组中获取最小值、最大值、第一个和最后一个值。

我知道 mysql 没有聚合函数、ctes、first 和 last 函数,否则这将是微不足道的。

所以我的计划是创建所有行的乘积(将表与自身连接),然后将它与每个间隔的最小和最大时间连接起来,以从间隔中获取第一个和最后一个值,但这会产生错误。

“on 子句”中的未知列“vs1.time”

我的查询有什么问题?并且可以使用相同的行乘积来获取最小值和最大值,或者我是否需要使用 group by 加入另一个查询?

另一种选择是用某种编程语言制作一个过程。程序不是一个选项。我想比较原始 SQL 和编程语言的性能。

这应该适用于 mysql 5.6。

最佳答案

您将 1992 年之前的逗号分隔连接语法与正确的 ANSI 连接混合在一起,这是不应该的。文档 ( https://dev.mysql.com/doc/refman/5.7/en/join.html) 明确指出:

However, the precedence of the comma operator is less than that of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur.

CROSS JOIN 替换逗号使其工作:FROM `values` vs1 CROSS JOIN `values` vs2

但是,我发现您的大部分条件都是多余的。加上为了可读性改变连接的顺序(特别是为了不假装交叉连接):

SELECT
    vs1.time as t1,
    vs1.value as v1,
    vs2.time as t2,
    vs2.value as v2
FROM 
(
  SELECT MIN(time) as mint, MAX(time) as maxt 
  FROM `values`
  GROUP BY hour(time), minute(time)
) as te
JOIN `values` vs1 ON vs1.time = te.mint
JOIN `values` vs2 ON vs2.time = te.maxt
ORDER BY vs1.time;

关于mysql - 如何加入子查询的 self 加入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46714226/

相关文章:

sql - 大传感器数据最佳选择。表 SQL 与 Azure 表

mysql - 在 Mysql 中,左/右连接两次获取同一列的结果

mysql - 是否可以组合 'DISTINCT' 和 'COUNT' 查询,以便我可以看到每个不同值出现的次数?

mysql - 无法使用 MySQL(8.0.15) 验证我的 Node js(v10.15.3) 应用程序、npm mysql (v2.17.1) (ER_ACCESS_DENIED_ERROR)

sql - 计算一个值在不同列中出现的次数

MySQL:合并两个表(相同模式)并创建一个新表 - SINGLE QUERY

mysql - 使用 SQL 连接来确定什么时候可用

php - 从另一个表中选择多个列,其中字段包含数组

MySQL错误1215无法添加外键约束

php - 为什么要释放 PHP 和 MySQL 的结果?