我需要一些帮助为MySQL版本5.7.29生成一个5.7.29查询
我拥有的数据集如下所示(示例数据):
| 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生成如下数据集:
| 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
的total_value是最新导入的sum,最新的导出reading_value是最新(最新)导入或导出E 220(以最晚的日期为准)。
我尝试了以下查询,但它给出了all的和每个serial_number的导入和导出值,而不仅仅是每个serial_number的最新导入和最新导出值之和。
select serial_number, sum(reading_value) as 'total_value', max(reading_date) as 'latest_reading_date'
from t1
group by serial_number如能提供任何协助,将不胜感激。
发布于 2020-03-11 13:31:09
有一种使用GROUP_CONCAT函数的棘手方法,它支持聚合值的排序。
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类型的逗号列表,idSUBSTRING_INDEX()将从list latest_import + latest_export )中获取第一个值(如果可能的话,检查空值),为了简洁的,我省略了这个值。
发布于 2020-03-11 13:18:06
如果我正确理解,您可以在聚合之前使用窗口函数:
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版本中,您可以使用关联子查询:
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;发布于 2020-03-11 13:25:23
您可以使用相关子查询进行聚合:
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;https://stackoverflow.com/questions/60636949
复制相似问题