首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用DATE_FORMAT求和(日期,'%Y-%m-%d')限制20,如果大于20则求和余值?

如何用DATE_FORMAT求和(日期,'%Y-%m-%d')限制20,如果大于20则求和余值?
EN

Stack Overflow用户
提问于 2022-02-09 07:53:27
回答 1查看 67关注 0票数 0

如何通过DATE_FORMAT(date,'%Y-%m-%d')和id对前20行数据进行求和,如果大于20其他0,则将剩余值相加?假设我下面有SQL下面的数据,该怎么做呢?非常感谢你的建议。

代码语言:javascript
运行
复制
SELECT SUM(value), id, DATE_FORMAT(date,'%Y-%m-%d') 
FROM test_table
GROUP BY id, DATE_FORMAT(date,'%Y-%m-%d')
代码语言:javascript
运行
复制
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

...

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 00:42:29

如果您使用的是支持窗口功能的MySQL版本,那么很可能:

代码语言:javascript
运行
复制
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函数的方法:

代码语言:javascript
运行
复制
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列“不正确”生成。我找到的解决办法是先在子查询中执行聚合,然后只尝试生成自定义行编号。请参阅上面我更新的查询和小提琴。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71045774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档