[英]How to join self join with subquery?
數據:
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);
和小提琴相同的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 函數,否則這將是微不足道的。
所以我的計划是創建所有行的乘積(將表與自身連接),然后將它與每個間隔的最小和最大時間連接起來,以從間隔中獲取第一個和最后一個值,但這會產生錯誤。
Unknown column 'vs1.time' in 'on clause'
我的查詢有什么問題? 並且可以使用相同的行乘積來獲得最小值和最大值,還是我需要使用group by
加入另一個查詢?
另一種選擇是用某種編程語言制作一個過程。 程序不是一種選擇。 我想比較原始 SQL 的性能並在編程語言中執行此操作。
這應該適用於 mysql 5.6。
您將 1992 年之前的逗號分隔連接語法與正確的 ANSI 連接混合在一起,您不應該這樣做。 文檔( https://dev.mysql.com/doc/refman/5.7/en/join.html )清楚地說明:
但是,逗號運算符的優先級低於 INNER JOIN、CROSS JOIN、LEFT JOIN 等。 如果在存在連接條件時將逗號連接與其他連接類型混合使用,則可能會出現“on 子句”中的“未知列”“col_name”形式的錯誤。
用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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.