如何按 DATE_FORMAT(date,'%Y-%m-%d') 限制 20 对值求和,如果大于 20,则对剩余值求和?

2024-04-02

如何求和DATE_FORMAT(date,'%Y-%m-%d')id 前 20 行数据,如果大于 20,则对剩余值求和,否则为 0?假设我有以下数据和以下 SQL,该怎么做?非常感谢您的任何建议。

SELECT SUM(value), id, DATE_FORMAT(date,'%Y-%m-%d') 
FROM test_table
GROUP BY id, DATE_FORMAT(date,'%Y-%m-%d')
sum(value)  id  DATE_FORMAT(date,'%Y-%m-%d')
-------------------------------------------- 
64.98   123456  2021-01-01
64.98   123456  2021-01-02
64.98   123456  2021-01-03
64.98   123456  2021-01-04
64.98   123456  2021-01-05
64.98   123456  2021-01-06
72.34   123456  2021-01-07
64.98   123456  2021-01-08
64.98   123456  2021-01-09
103.80  123456  2021-01-10
64.98   123456  2021-01-11
64.98   123456  2021-01-12
64.98   123456  2021-01-13
64.98   123456  2021-01-14
64.98   123456  2021-01-15
64.98   123456  2021-01-16
64.98   123456  2021-01-17
64.98   123456  2021-01-18
64.98   123456  2021-01-19
64.98   123456  2021-01-20
64.98   123456  2021-01-21
64.98   123456  2021-01-22
64.98   123456  2021-01-23
64.98   123456  2021-01-24
144.98  123456  2021-01-25
64.98   123456  2021-01-26
64.98   123456  2021-01-27
64.98   123456  2021-01-28
64.98   123456  2021-01-29
64.98   123456  2021-01-30
64.98   123456  2021-01-31
64.98   123456  2021-02-01
64.98   123456  2021-02-02
64.98   123456  2021-02-03
64.98   123456  2021-02-04
720.92  123456  2021-02-05
66.98   123456  2021-02-06
66.98   123456  2021-02-07
66.98   123456  2021-02-08
64.98   123456  2021-02-09
64.98   123456  2021-02-10
64.98   123456  2021-02-11
64.98   123456  2021-02-12
64.98   123456  2021-02-13
64.98   123456  2021-02-14
64.98   123456  2021-02-15
64.98   123456  2021-02-16
64.98   123456  2021-02-17
64.98   123456  2021-02-18
64.98   123456  2021-02-19
64.98   123456  2021-02-20
64.98   223456  2021-01-20
54.98   223456  2021-01-21

......................................


如果您使用支持窗口函数的 MySQL 版本,那么可能:

SELECT id,
       SUM(CASE WHEN rn <= 20 THEN vals ELSE 0 END) AS 'SumOf1st20',
       SUM(CASE WHEN rn > 20 THEN vals ELSE 0 END) AS 'SumOFOthers'
FROM
(SELECT SUM(value) AS vals, id, DATE_FORMAT(date,'%Y-%m-%d') AS dt,
       ROW_NUMBER() OVER (PARTITION BY id ORDER BY dt DESC) AS rn
FROM test_table
GROUP BY id, dt) v
GROUP BY id;

但我想知道这是否正是您想要的,因为您的示例数据似乎是原始查询的结果。

以供参考。

这是一种复制方法ROW_NUMBER()旧 MySQL 版本中的函数:

SELECT t1.*,
       CASE WHEN id=@idx THEN @rnk := @rnk+1 
        ELSE @rnk := 1 END AS rn,
        @idx := id
 FROM (SELECT id, 
          SUM(value) AS vals, DATE_FORMAT(date,"%Y-%m-%d") AS dt 
   FROM test_table 
   GROUP BY id, dt)t1
 CROSS JOIN (SELECT @rnk := 0, @idx := NULL) r
 ORDER BY id, dt DESC

不过,(在极少数情况下)我有过这样的经验:行编号有时会变得混乱。

经过进一步的测试,这种“罕见的情况”似乎正在发生在这里。由于您的原始查询包含聚合,因此我将其与 v8 兼容的进行比较ROW_NUMBER()我得到了不同的结果。根据观察,行号是在ORDER BY xxx DESC发生。所以,从视觉上看,它确实按date相应地下降,但rn column “不正确地”生成的。我发现的解决方法是首先在子查询中执行聚合,然后仅尝试生成自定义行编号。请参阅上面我更新的查询和小提琴。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何按 DATE_FORMAT(date,'%Y-%m-%d') 限制 20 对值求和,如果大于 20,则对剩余值求和? 的相关文章

  • 我忘记了分号“;”在 MySQL 终端查询中。我该如何退出?

    有时我忘记用分号 结束 SQL 查询 在我的 Mac 终端中 发生这种情况时 终端会设置一个 gt 一开始我无法退出此命令或运行任何其他 SQL 命令 我该如何退出 你不知道mysql终端有5种不同的报价模式 我建议你回顾一下它们 http
  • ORA-01741: 非法的零长度标识符

    您好 我在 shell 脚本中使用删除查询 并且遇到了这个问题 delete from WHITELIST CLI where filecode like Line Index condense Error ERROR ORA 01741
  • 如何在JdbcTemplate中执行多批量删除?

    我想一次删除多个数据库条目 仅当 3 个字段匹配 此处 姓名 电子邮件 年龄 时 才应删除每个条目 如果我只想删除单个属性 我会选择 String sql DELETE FROM persons WHERE email IN JdbcTem
  • Perl:通过一次 MySQL 调用更新多行

    似乎这不可能 但嘿我不妨问一下 我可能是错的 想知道 perl 是否可以使用一个 MySQL 调用来更新多行 我正在使用 DBI 任何帮助或反馈将不胜感激 这可以通过 ASP 和 ASP net 在 MSSQL 中实现 所以想知道是否也可以
  • 将文件保存为 MYSQL 数据库中的 blob 或文件路径

    我知道这些问题是常见问题之一 但我需要您针对具体案例提供帮助 我正在开发一个应用程序 其中一些用户可以添加订单 一些用户可以执行这些订单 这些订单非常具体 因此只有有限数量的用户可以添加它们 然后 为每个订单生成三个文档 每个文档的大小不超
  • PHP 与 MySQL 中的资源 id #6 错误

    我这是为了我正在制作的投票系统 此代码向用户显示了他们可以从中选择的问题列表 div class main questions p class style1 style2 strong Select Your Question strong
  • H2 中的 IF 函数用于 MySQL 兼容性

    我正在使用 H2 具有 MySQL 兼容模式 针对我们使用 MySQL 的软件编写一些自动化测试 不幸的是 H2 似乎没有IF我们的许多查询都使用该函数 除了使用 DECODE 之类的东西重写我们的应用程序查询之外 它们是创建 if 函数
  • 带有输出文件和屏幕输出的 sqlcmd

    我使用 sqlcmd 执行一些命令行批处理 bat 如下所示 sqlcmd i Scripts STEP01 sql o PROCESS log S MYSERVER E d MYDATABASE 我需要一个输出文件 当前有效 以及通过屏幕
  • 使用 MySQL Workbench 创建新数据库

    作为 MySQL 新手 我安装了最新版本的 MySQL Workbench 5 2 33 我想知道如何使用此应用程序创建数据库 在 SQL 编辑器的 概述 选项卡中 几乎没有显示 MySQL 架构 这些架构是现有数据库吗 启动 MySQL
  • 如何在MySQL中使用数字字符串的比较运算符?

    我有一个员工表 有类似领域的经验VARCHAR类型 此字段结合了用短划线 分隔的总年份和总月份 因此我必须按年份过滤具有 3 年以上经验的经验 我的表结构 所以现在我必须获得3年以上经验的id 我尝试如下 SELECT FROM emplo
  • AWS EMR PySpark 连接到 mysql

    我正在尝试使用 jdbc 通过 pyspark 连接到 mysql 我可以在 EMR 之外完成此操作 但是当我尝试使用 EMR 时 pyspark 无法正确启动 我在我的机器上使用的命令 pyspark conf spark executo
  • 如何从其他表填充表的外键

    我有以下表格 其中translation是空的 我正在尝试填充 translation id translated language id template id language id langname langcode template
  • SQL 查询:按 ntext 字段分组

    我有以下查询 它基本上检索销量最高的 5 本书 select top 5 count id book orddetails books sold bk from orderdetails orddetails ord inner join
  • Symfony 3.4 没有元数据类来处理错误

    我已经安装了 symfony 3 4 和 学说包 php gt 5 5 9 doctrine doctrine bundle 1 8 doctrine doctrine migrations bundle 1 3 doctrine orm
  • SQL错误:1054,SQLState:42S22“字段列表”中的未知列错误Java Spring Boot Mysql错误

    基本上我正在尝试制作一个简单的促销页面 我收到的错误是 SQL 错误 1054 SQLState 42S22 错误是 字段列表 中的未知列 promotion0 promo type id 这是模型类 package promotions
  • 调用不同 SELECT 语句的 MySQL IF/CASE 语法

    我在使用 MySQL 时遇到问题IF or CASE syntax 程序是这样的 我有一个调用 MySQL 查询的 PHP 项目 假设 PHP 传递变量X If X is not 0那么它应该执行如下查询 SELECT FROM table
  • 提交表单问题... Enter key

    我有一个包含几个下拉列表和一个文本字段以及一个按钮的表单 当我单击按钮时 将调用 ajax 函数 ajax 然后调用一个 php 函数 该函数从 mysql 数据库获取结果 问题是我不能通过在表单中 按回车键来完成同样的事情 页面只会刷新
  • 加入多对多关系

    我有三个表 applications permissions 和 applications permissions applications applications permissions permissions id lt applic
  • 如何提取 MySQL 日期中的月份和年份并进行比较?

    如何从 mySQL 日期中提取月份和日期并将其与另一个日期进行比较 我找到了 this MONTH 但它只获取月份 我寻找月份和年份 在Mysql Doku中 http dev mysql com doc refman 5 5 en dat
  • 如何提高MySQL INSERT和UPDATE性能?

    我们数据库中的 INSERT 和 UPDATE 语句的性能似乎正在下降 并导致我们的 Web 应用程序性能不佳 表是InnoDB 应用程序使用事务 我可以做一些简单的调整来加快速度吗 我认为我们可能会遇到一些锁定问题 我怎样才能找到答案 你

随机推荐