V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
echooo0
V2EX  ›  程序员

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

  •  
  •   echooo0 · 2023-07-14 23:09:13 +08:00 · 1527 次点击
    这是一个创建于 498 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2023-07-15 12:59:05 +08:00

    用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
    
    12 条回复    2023-07-16 17:30:47 +08:00
    s3040608090
        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
    echooo0
        2
    echooo0  
    OP
       2023-07-14 23:33:36 +08:00
    @s3040608090 #1 这个适用于 MySQL 5.6 吗,好像提示语法错误
    echooo0
        3
    echooo0  
    OP
       2023-07-14 23:42:46 +08:00
    @echooo0 #2 查了下好像 8.0 才支持。。。。
    echooo0
        4
    echooo0  
    OP
       2023-07-14 23:55:53 +08:00
    不过 chatgpt 还是有点强的,把 8.0 的语法翻译成了 5.6 的语法, 5.6 版本出来的 SQL 结果就很长了
    wxf666
        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
    ```
    echooo0
        6
    echooo0  
    OP
       2023-07-15 12:54:57 +08:00
    @wxf666 #5 你这个貌似不太符合需求
    wxf666
        7
    wxf666  
       2023-07-15 14:35:00 +08:00
    @echooo0 #6 是哪个要求没实现呢?
    ccjy778899
        8
    ccjy778899  
       2023-07-15 14:59:14 +08:00
    5 不支持窗口函数,你这个又要聚合又要分组排序,没有办法再简洁了
    echooo0
        9
    echooo0  
    OP
       2023-07-15 15:16:57 +08:00
    @wxf666 #7 可以看一下上面发的 8.0 的 sql
    echooo0
        10
    echooo0  
    OP
       2023-07-15 15:18:51 +08:00
    @ccjy778899 #8 确实,但是数据库升级是个麻烦事,不知道 5.6 升级到 8 会不会有坑
    wxf666
        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
    echooo0
        12
    echooo0  
    OP
       2023-07-16 17:30:47 +08:00
    @wxf666 #11 是的,要做分组;需求完整描述应该是这样: 在一个表中,对其中一个字段 A 按照 C 分组后,使用 sum 函数,另一个字段 B 按照 C 分组后,按照创建时间 createAt 返回其最后一行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1944 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:43 · PVG 08:43 · LAX 16:43 · JFK 19:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.