请问下面这个 SQL 有没有优雅的写法

2023-07-14 23:09:13 +08:00
 echooo0

在一个表中,对其中一个字段 A 使用 sum 函数,另一个字段 B 按照创建时间 createAt 返回其最后一行

问了下 chatgpt ,没给出想要的答案,不知道是不是提示 prompt 给的不够好

1546 次点击
所在节点    程序员
12 条回复
s3040608090
2023-07-14 23:26:30 +08:00
用窗口函数 last_value 呢:
Select
sum(A) as Atotal,
last_value(B) over (order by createAt) as last_created_B
From
Table
echooo0
2023-07-14 23:33:36 +08:00
@s3040608090 #1 这个适用于 MySQL 5.6 吗,好像提示语法错误
echooo0
2023-07-14 23:42:46 +08:00
@echooo0 #2 查了下好像 8.0 才支持。。。。
echooo0
2023-07-14 23:55:53 +08:00
不过 chatgpt 还是有点强的,把 8.0 的语法翻译成了 5.6 的语法, 5.6 版本出来的 SQL 结果就很长了
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
```
echooo0
2023-07-15 12:54:57 +08:00
@wxf666 #5 你这个貌似不太符合需求
wxf666
2023-07-15 14:35:00 +08:00
@echooo0 #6 是哪个要求没实现呢?
ccjy778899
2023-07-15 14:59:14 +08:00
5 不支持窗口函数,你这个又要聚合又要分组排序,没有办法再简洁了
echooo0
2023-07-15 15:16:57 +08:00
@wxf666 #7 可以看一下上面发的 8.0 的 sql
echooo0
2023-07-15 15:18:51 +08:00
@ccjy778899 #8 确实,但是数据库升级是个麻烦事,不知道 5.6 升级到 8 会不会有坑
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
echooo0
2023-07-16 17:30:47 +08:00
@wxf666 #11 是的,要做分组;需求完整描述应该是这样: 在一个表中,对其中一个字段 A 按照 C 分组后,使用 sum 函数,另一个字段 B 按照 C 分组后,按照创建时间 createAt 返回其最后一行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/956894

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX