【发布时间】:2020-02-17 00:36:56
【问题描述】:
假设我有一个包含字段的表“值” 标识(整数) 名称(varchar) 值(浮点数) 时间戳(整数)
现在我想计算整个值表中每个名称的最高最低值和第一个值(基于时间戳)。
这是否可以在一个单一的高性能查询中实现?我偶然发现了“first_value”函数,但那个函数似乎不起作用。我尝试了以下查询,使用连接,但也没有成功。
SELECT
a.name,
b.value as open,
MIN(a.value) as low,
MAX(a.value) as high
FROM values a
LEFT JOIN values b
ON a.name = b.name AND b.id = MIN(a.id)
GROUP BY a.name;
难道没有某种功能可以使类似的事情成为可能吗?
SELECT
name,
FIRST_VALUE(value) as open,
MIN(value) as low,
MAX(value) as high
FROM values
GROUP BY name
ORDER BY timestamp ASC;
示例数据
id name value timestamp
1 USD 3 16540
2 EUR 5 16540
3 GBP 4 16540
4 EUR 2 16600
5 USD 4 16600
6 GBP 5 16600
7 USD 6 16660
8 EUR 7 16660
9 GBP 6 16660
10 USD 5 16720
11 EUR 5 16720
12 GBP 7 16720
13 EUR 8 16780
14 USD 7 16780
15 GBP 8 16780
示例输出
name open low high
USD 3 3 7
EUR 5 2 8
GBP 4 4 8
我正在使用 MySQL 客户端版本:5.6.39 平局应该是不可能的,如果是的话,我不在乎选择哪个值。
【问题讨论】:
-
您使用的是哪个版本的 MySQL?
-
您要做什么不是很清楚。您能否提供示例数据和预期结果来澄清您的问题?
-
即使在使用 ORDER BY 时定义“第一”,在值关联的情况下,排序也不会固定。此外,此 ORDER BY 对 ANSI/ISO SQL GROUP BY 规则无效。如@GMB建议我们需要查看示例数据和预期结果。见Why should I provide a Minimal Reproducible Example for a very simple SQL query?
-
你试过UNION命令吗?
-
我用示例数据编辑了帖子
标签: mysql max greatest-n-per-group min window-functions