在一个表中,对其中一个字段 A 使用 sum 函数,另一个字段 B 按照创建时间 createAt 返回其最后一行
问了下 chatgpt ,没给出想要的答案,不知道是不是提示 prompt 给的不够好
用mysql 8.0的语法来表示就是如下,可以用chatgpt转换成5.6的语法,不过输出的结果就很长,不是很优雅
Select
sum(A) as Atotal,
last_value(B) over (partition by c order by create_at) as last_created_B
From
Table
1
s3040608090 2023-07-14 23:26:30 +08:00 via iPhone
用窗口函数 last_value 呢:
Select sum(A) as Atotal, last_value(B) over (order by createAt) as last_created_B From Table |
2
echooo0 OP @s3040608090 #1 这个适用于 MySQL 5.6 吗,好像提示语法错误
|
4
echooo0 OP 不过 chatgpt 还是有点强的,把 8.0 的语法翻译成了 5.6 的语法, 5.6 版本出来的 SQL 结果就很长了
|
5
wxf666 2023-07-15 00:17:31 +08:00
这样?
```sql SELECT (SELECT SUM(A) FROM table), B FROM table ORDER BY createAt DESC LIMIT 1 ``` |
8
ccjy778899 2023-07-15 14:59:14 +08:00
5 不支持窗口函数,你这个又要聚合又要分组排序,没有办法再简洁了
|
10
echooo0 OP @ccjy778899 #8 确实,但是数据库升级是个麻烦事,不知道 5.6 升级到 8 会不会有坑
|
11
wxf666 2023-07-15 17:13:44 +08:00
@echooo0 #9 我测试了,我的 SQL 符合你描述的需求。
对你的 SQL 有些疑问: 1. `partition by c` 没在你的需求描述中体现出来。 2. 运行后报错: > Error: ER_MIX_OF_GROUP_FUNC_AND_FIELDS: In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column 'test.tbl.b'; this is incompatible with sql_mode=only_full_group_by |