首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个组的MySQL和最新值

具有多个组的MySQL和最新值
EN

Stack Overflow用户
提问于 2020-03-11 13:15:53
回答 3查看 69关注 0票数 0

我需要一些帮助为MySQL版本5.7.29生成一个5.7.29查询

我拥有的数据集如下所示(示例数据):

代码语言:javascript
复制
| id | serial_number | reading_value | reading_date        | register_type |
|----|---------------|---------------|---------------------|---------------|
| 1  | 123           | 7492.91       | 2019-11-20 15:37:55 | import        |
| 2  | 123           | 7783.3        | 2019-11-25 11:15:47 | import        |
| 3  | 123           | 0             | 2019-11-26 13:34:01 | export        |
| 4  | 123           | 4.01          | 2019-11-27 13:52:23 | export        |
| 5  | 456           | 7404.93       | 2019-11-24 13:31:06 | import        |
| 6  | 456           | 7758.23       | 2019-11-26 13:35:02 | import        |
| 7  | 456           | 0             | 2019-11-20 15:37:55 | export        |
| 8  | 456           | 0             | 2019-11-26 13:34:01 | export        |

我希望获得sum of reading_value of reading_value import和导出,以便为每个serial_number生成如下数据集:

代码语言:javascript
复制
| serial_number | total_value | latest_reading_date |
|---------------|-------------|---------------------|
| 123           | 7787.31     | 2019-11-27 13:52:23 | <--- id 2 and 4 from above table
| 456           | 7758.23     | 2019-11-26 13:35:02 | <--- id 6 and 8 from above table

在此结果数据集中,serial_number

  • the serial_number

的total_value是最新导入的sum,最新的导出reading_value是最新(最新)导入或导出E 220(以最晚的日期为准)。

我尝试了以下查询,但它给出了all的和每个serial_number的导入和导出值,而不仅仅是每个serial_number的最新导入和最新导出值之和。

代码语言:javascript
复制
select serial_number, sum(reading_value) as 'total_value', max(reading_date) as 'latest_reading_date'
from t1
group by serial_number

如能提供任何协助,将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2020-03-11 13:31:09

有一种使用GROUP_CONCAT函数的棘手方法,它支持聚合值的排序。

代码语言:javascript
复制
SELECT serial_number, 
    SUBSTRING_INDEX(GROUP_CONCAT(IF(register_type = 'import', total_value, NULL) ORDER BY reading_date DESC, id DESC), ',', 1) `latest_import`,
    SUBSTRING_INDEX(GROUP_CONCAT(IF(register_type = 'export', total_value, NULL) ORDER BY reading_date DESC, id DESC), ',', 1) `latest_export`
FROM t1
GROUP BY serial_number

解释:

  • GROUP_CONCAT(IF(register_type = 'import', total_value, NULL) ORDER BY reading_date DESC, id DESC) -将生成一个逗号--按日期排序的带有import类型的import类型的逗号列表,id
  • SUBSTRING_INDEX()将从list
  • (您想要的值为latest_import + latest_export )中获取第一个值(如果可能的话,检查空值),为了简洁的

,我省略了这个值。

票数 1
EN

Stack Overflow用户

发布于 2020-03-11 13:18:06

如果我正确理解,您可以在聚合之前使用窗口函数:

代码语言:javascript
复制
select serial_number, sum(reading_value) as total_value, 
       max(reading_date) as latest_reading_date
from (select t1.*,
             row_number() over (partition by serial_number, register_type order by reading_date) as seqnum
      from t1
     ) t
group by serial_number;

在MySQL的前8.0版本中,您可以使用关联子查询:

代码语言:javascript
复制
select serial_number, sum(reading_value) as total_value, 
       max(reading_date) as latest_reading_date
from t1
where t1.reading_date = (select max(tt1.reading_date)
                         from t1 tt1
                         where tt1.serial_number = t1.serial_number and
                               tt1.register_type = t1.register_type
                        )
group by serial_number;
票数 0
EN

Stack Overflow用户

发布于 2020-03-11 13:25:23

您可以使用相关子查询进行聚合:

代码语言:javascript
复制
select t1_1.serial_number, sum(t1_1.reading_value) as total_value, 
       max(t1_1.reading_date) as latest_reading_date
from t1_1
where t1_1.reading_date = (select max(t1_2.reading_date) 
                           from t1 as t1_2
                           where t1_2.serial_number = t1_1.serial_number and 
                                 t1_2.register_type = t1_1.register_type
                          )
group by t1_1.serial_number;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60636949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档