簡體   English   中英

如何使用子查詢加入自聯接?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM