Mysql 如何获取跨多个键的列的总和?
我有如下数据:Mysql 如何获取跨多个键的列的总和?,mysql,Mysql,我有如下数据: id int (11) primary key auto_increment key int (2) type int (2) data int (4) timestamp datetime 有5种不同的键-1,2,3,4,5和三种类型-1,2,3 数据是针对一个键和特定类型连续输入的 我需要提取的是跨越所有5个键(1,2,3,4,5)的特定类型(比如类型1)的数据总和,所以它正好是5条记录的总和。我只想对每个键的最新(max(timestamp))数据值(有5个)求和,
id int (11) primary key auto_increment
key int (2)
type int (2)
data int (4)
timestamp datetime
有5种不同的键-1,2,3,4,5和三种类型-1,2,3
数据是针对一个键和特定类型连续输入的
我需要提取的是跨越所有5个键(1,2,3,4,5)的特定类型(比如类型1)的数据总和,所以它正好是5条记录的总和。我只想对每个键的最新(max(timestamp))数据值(有5个)求和,但它们可能都有不同的时间戳
像这样的
SELECT sum(data) FROM table WHERE type='1' AND timestamp=(SELECT max(timestamp FROM table WHERE type='1' GROUP BY key)
或者诸如此类的。当然,这还不算接近。我完全不明白这一点。感觉我需要按键分组,但语法让我摸不着头脑。任何建议都将不胜感激
编辑:其他信息:
如果:“数据”是温度,“键”是一周中的一天。“类型”是早晨、中午或晚上
所以数据可能看起来像
morning mon 70 (timestamp)
noon tue 78 (timestamp)
morning wed 72 (timestamp)
night tue 74 (timestamp)
morning thu 76 (timestamp)
noon wed 77 (timestamp)
night fri 78 (timestamp)
noon tue 79 (timestamp)
如果它们是按时间戳顺序(desc)排列的我想要所有五天中最近中午时间的总和,结果是:155,因为最后一个中午也是星期二,时间更早,因此不包括在内。有意义吗?我只想要任何键、特定类型、最新时间戳的“数据”总和。在本例中,我最多要加7条数据。隐式性和可维护性使用一个临时表,并用几个语句填充它 所以 编辑: subselect解决方案与此类似,因为只有3种类型,这还不错
select type, sum(value) as total from
(select 1 as type, value from data_table where type=1 order by timestamp desc limit 5
union
select 2 as type, value from data_table where type=2 order by timestamp desc limit 5
union
select 3 as type, value from data_table where type=3 order by timestamp desc limit 5) as subtab group by type;
希望能有所帮助。为了简单性和可维护性,我会使用一个临时表并用几个语句填充它。带有“union subselect”的解决方案对我来说有点长
SELECT SUM(data)
FROM ( SELECT CONCAT(MAX(timestamp), '_', type) AS customId
FROM table
WHERE type = '1'
GROUP BY key ) a
JOIN table b ON a.customId = CONCAT(b.timestamp, '_', type)
GROUP BY type;
所以
编辑:
subselect解决方案与此类似,因为只有3种类型,这还不错
select type, sum(value) as total from
(select 1 as type, value from data_table where type=1 order by timestamp desc limit 5
union
select 2 as type, value from data_table where type=2 order by timestamp desc limit 5
union
select 3 as type, value from data_table where type=3 order by timestamp desc limit 5) as subtab group by type;
希望有帮助
SELECT SUM(data)
FROM ( SELECT CONCAT(MAX(timestamp), '_', type) AS customId
FROM table
WHERE type = '1'
GROUP BY key ) a
JOIN table b ON a.customId = CONCAT(b.timestamp, '_', type)
GROUP BY type;
这可能会奏效
这可能会奏效
如果
时间戳
列保证每个(键
,类型
)都是唯一的(也就是说,(键,类型,时间戳)上有一个唯一的约束,那么这个查询将返回指定的结果集。(这不是唯一的方法,但这是一种熟悉的模式):
为所有5个键值(如果至少存在一行)分配了别名m
的内联视图返回type=1的“latest”时间戳
连接到原始表,以检索具有“最新”时间戳的行
带有类型
,键
,时间戳
的前导列的适当索引可能会提高性能
(这是基于我对规范的理解;我可能不完全清楚规范。此查询所做的是获取type=1
行的最新时间戳。如果恰好有两行(或更多行)具有给定键和类型的相同最新时间戳值,则此查询将同时检索这两行(或全部)并将其包含在总和中
我们可以在该查询中添加一个GROUP BY t.type
,这不会改变结果,因为我们可以保证t.type将等于常量1(在内联视图查询的WHERE子句的谓词中指定)
但是,如果我们想在同一个查询中获得所有三种类型的总数,则需要通过添加组:
SELECT t.key
, SUM(t.data) AS latest_total
FROM mytable t
JOIN ( SELECT h.type
, h.key
, MAX(h.timestamp) AS max_ts
FROM mytable h
WHERE h.type IN ('1','2','3')
GROUP
BY h.type
, h.key
) m
ON m.type = t.type
AND m.key = t.key
AND m.max_ts = t.timestamp
GROUP
BY t.key
注意:
使用保留字作为标识符(例如,时间戳
和键
)并不违法,但这些标识符(通常)需要包含在反勾中。但更改这些列的名称以使它们不是保留字是最佳做法。如果时间戳
列保证每个列都是唯一的(key
,type
)(也就是说,在(key,type,timestamp)
上有一个唯一的约束,那么这个查询将返回指定的结果集。(这不是唯一的方法,但这是一种熟悉的模式):
为所有5个键值(如果至少存在一行)分配了别名m
的内联视图返回type=1的“latest”时间戳
连接到原始表,以检索具有“最新”时间戳的行
带有类型
,键
,时间戳
的前导列的适当索引可能会提高性能
(这是基于我对规范的理解;我可能不完全清楚规范。此查询所做的是获取type=1
行的最新时间戳。如果恰好有两行(或更多行)具有给定键和类型的相同最新时间戳值,则此查询将同时检索这两行(或全部)并将其包含在总和中
我们可以在该查询中添加一个GROUP BY t.type
,这不会改变结果,因为我们可以保证t.type将等于常量1(在内联视图查询的WHERE子句的谓词中指定)
但是,如果我们想在同一个查询中获得所有三种类型的总数,则需要通过添加组:
SELECT t.key
, SUM(t.data) AS latest_total
FROM mytable t
JOIN ( SELECT h.type
, h.key
, MAX(h.timestamp) AS max_ts
FROM mytable h
WHERE h.type IN ('1','2','3')
GROUP
BY h.type
, h.key
) m
ON m.type = t.type
AND m.key = t.key
AND m.max_ts = t.timestamp
GROUP
BY t.key
注意:
使用保留字作为标识符(例如,时间戳
和键
并不违法,但这些标识符(通常)需要用反勾号括起来。但最好更改这些列的名称,使其不是保留字。对不起,道格,这并不完全清楚。您能简单地编辑您的问题,提供一个(简短但重要的)答案吗数据样本以及预期结果?如果时间戳不是唯一的,即您可以在同一秒有两个条目,这可能会有点棘手。或者现在有效的解决方案将失效。对于每个键/类型/时间戳组合,时间戳将始终是唯一的,这意味着在上面的示例中,您将永远不会看到同一天有两行一天中的第二个时间