MySQL 基于两列的高级计算
MySQL advanced calculation based on two columns
我正在尝试弄清楚是否可以使用 MySQL workbench 为我提供一些基于 id、statement_one 和 [=36] 的高级计算=]. 我的基地 table 看起来像这样:
基本上我希望测试列如下所示:
- 对于 id=1,测试列从 2019Q3 到 2021Q2 显示“1”,其他所有显示“0”。
- 对于 id=22,测试列从 2019Q2 到 2021Q3 显示“1”,其他所有显示“0”。
有人知道我可以使用哪个函数来创建计算基于每个 id 的 statement_one 和 last_statement 范围? 预先感谢您你的帮助!
您可以尝试这样的查询:
首先我得到 first_statement (MIN
) 和 last_statement (MAX
) 对于每个 id
,然后我 JOIN
cte
子查询与原始 table 并使用 CASE
语句计算 test
列。
MySql >= 8.0
WITH cte AS (SELECT id, MIN(statement_one) AS fs, MAX(latest_statement) AS ls
FROM t
GROUP BY id)
SELECT *,
CASE WHEN quarter >= cte.fs AND quarter <= cte.ls THEN 1 ELSE 0 END AS test
FROM t
INNER JOIN cte ON t.id = cte.id;
MySql < 8.0
SELECT *,
CASE WHEN quarter >= sq.fs AND quarter <= sq.ls THEN 1 ELSE 0 END AS test
FROM t
INNER JOIN (SELECT id, MIN(statement_one) AS fs, MAX(latest_statement) AS ls
FROM t
GROUP BY id) AS sq ON t.id = sq.id;
id
quarter
statement_one
latest_statement
id
fs
ls
test
1
2019Q1
1
2019Q3
2021Q2
0
1
2019Q2
1
2019Q3
2021Q2
0
1
2019Q3
2019Q3
1
2019Q3
2021Q2
1
1
2019Q4
1
2019Q3
2021Q2
1
1
2020Q1
1
2019Q3
2021Q2
1
1
2020Q2
1
2019Q3
2021Q2
1
1
2020Q3
1
2019Q3
2021Q2
1
1
2020Q4
1
2019Q3
2021Q2
1
1
2021Q1
1
2019Q3
2021Q2
1
1
2021Q2
2021Q2
1
2019Q3
2021Q2
1
1
2021Q3
1
2019Q3
2021Q2
0
1
2021Q4
1
2019Q3
2021Q2
0
22
2019Q1
22
2019Q2
2021Q3
0
22
2019Q2
2019Q2
22
2019Q2
2021Q3
1
22
2019Q3
22
2019Q2
2021Q3
1
22
2019Q4
22
2019Q2
2021Q3
1
22
2020Q1
22
2019Q2
2021Q3
1
22
2020Q2
22
2019Q2
2021Q3
1
22
2020Q3
22
2019Q2
2021Q3
1
22
2020Q4
22
2019Q2
2021Q3
1
22
2021Q1
22
2019Q2
2021Q3
1
22
2021Q2
22
2019Q2
2021Q3
1
22
2021Q3
2021Q3
22
2019Q2
2021Q3
1
22
2021Q4
22
2019Q2
2021Q3
0
我正在尝试弄清楚是否可以使用 MySQL workbench 为我提供一些基于 id、statement_one 和 [=36] 的高级计算=]. 我的基地 table 看起来像这样:
基本上我希望测试列如下所示:
- 对于 id=1,测试列从 2019Q3 到 2021Q2 显示“1”,其他所有显示“0”。
- 对于 id=22,测试列从 2019Q2 到 2021Q3 显示“1”,其他所有显示“0”。
有人知道我可以使用哪个函数来创建计算基于每个 id 的 statement_one 和 last_statement 范围? 预先感谢您你的帮助!
您可以尝试这样的查询:
首先我得到 first_statement (MIN
) 和 last_statement (MAX
) 对于每个 id
,然后我 JOIN
cte
子查询与原始 table 并使用 CASE
语句计算 test
列。
MySql >= 8.0
WITH cte AS (SELECT id, MIN(statement_one) AS fs, MAX(latest_statement) AS ls
FROM t
GROUP BY id)
SELECT *,
CASE WHEN quarter >= cte.fs AND quarter <= cte.ls THEN 1 ELSE 0 END AS test
FROM t
INNER JOIN cte ON t.id = cte.id;
MySql < 8.0
SELECT *,
CASE WHEN quarter >= sq.fs AND quarter <= sq.ls THEN 1 ELSE 0 END AS test
FROM t
INNER JOIN (SELECT id, MIN(statement_one) AS fs, MAX(latest_statement) AS ls
FROM t
GROUP BY id) AS sq ON t.id = sq.id;
id | quarter | statement_one | latest_statement | id | fs | ls | test |
---|---|---|---|---|---|---|---|
1 | 2019Q1 | 1 | 2019Q3 | 2021Q2 | 0 | ||
1 | 2019Q2 | 1 | 2019Q3 | 2021Q2 | 0 | ||
1 | 2019Q3 | 2019Q3 | 1 | 2019Q3 | 2021Q2 | 1 | |
1 | 2019Q4 | 1 | 2019Q3 | 2021Q2 | 1 | ||
1 | 2020Q1 | 1 | 2019Q3 | 2021Q2 | 1 | ||
1 | 2020Q2 | 1 | 2019Q3 | 2021Q2 | 1 | ||
1 | 2020Q3 | 1 | 2019Q3 | 2021Q2 | 1 | ||
1 | 2020Q4 | 1 | 2019Q3 | 2021Q2 | 1 | ||
1 | 2021Q1 | 1 | 2019Q3 | 2021Q2 | 1 | ||
1 | 2021Q2 | 2021Q2 | 1 | 2019Q3 | 2021Q2 | 1 | |
1 | 2021Q3 | 1 | 2019Q3 | 2021Q2 | 0 | ||
1 | 2021Q4 | 1 | 2019Q3 | 2021Q2 | 0 | ||
22 | 2019Q1 | 22 | 2019Q2 | 2021Q3 | 0 | ||
22 | 2019Q2 | 2019Q2 | 22 | 2019Q2 | 2021Q3 | 1 | |
22 | 2019Q3 | 22 | 2019Q2 | 2021Q3 | 1 | ||
22 | 2019Q4 | 22 | 2019Q2 | 2021Q3 | 1 | ||
22 | 2020Q1 | 22 | 2019Q2 | 2021Q3 | 1 | ||
22 | 2020Q2 | 22 | 2019Q2 | 2021Q3 | 1 | ||
22 | 2020Q3 | 22 | 2019Q2 | 2021Q3 | 1 | ||
22 | 2020Q4 | 22 | 2019Q2 | 2021Q3 | 1 | ||
22 | 2021Q1 | 22 | 2019Q2 | 2021Q3 | 1 | ||
22 | 2021Q2 | 22 | 2019Q2 | 2021Q3 | 1 | ||
22 | 2021Q3 | 2021Q3 | 22 | 2019Q2 | 2021Q3 | 1 | |
22 | 2021Q4 | 22 | 2019Q2 | 2021Q3 | 0 |