Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何获取跨多个键的列的总和?_Mysql - Fatal编程技术网

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
注意:


使用保留字作为标识符(例如,
时间戳
并不违法,但这些标识符(通常)需要用反勾号括起来。但最好更改这些列的名称,使其不是保留字。

对不起,道格,这并不完全清楚。您能简单地编辑您的问题,提供一个(简短但重要的)答案吗数据样本以及预期结果?如果时间戳不是唯一的,即您可以在同一秒有两个条目,这可能会有点棘手。或者现在有效的解决方案将失效。对于每个键/类型/时间戳组合,时间戳将始终是唯一的,这意味着在上面的示例中,您将永远不会看到同一天有两行一天中的第二个时间