数据:
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/