作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
想象一下这张 table
Name | Date | Value
--------------------
Olli | 2019 | 2
Olli | 2018 | 2
Olli | 2017 | 2
Olli | 2016 | 1
Olli | 2015 | 1
Olli | 2014 | 1
Pete | 2019 | 3
Pete | 2018 | 3
Pete | 2017 | 3
Pete | 2016 | 2
Pete | 2015 | 9
我想选择短期平均值(最新 3 行)与每个名称的历史平均值的商:
Olli: 2 / 1.5 = 1.3333
Pete: 3 / 4 = 0.75
没有按名称分组,我可以轻松选择所有组件:
SELECT MEAN(value) FROM tbl WHERE name = 'Olli' -- all time mean, used directly in final query
-- for the short term mean I use a CTE:
WITH short_term_tbl AS (SELECT * FROM tbl WHERE name = 'Olli' ORDER BY Date DESC LIMIT 3)
SELECT MEAN(short_term_tbl.value) / MEAN(table.value)
FROM short_term_tbl, tbl
但我怎样才能将其推广到所有名称呢?
我很乐意找到一个适用于 mysql 和 postgresql 的解决方案。
最佳答案
在 MySQL 8.0 中(您似乎正在使用它,因为您使用的是 CTE,它仅从该版本的 MySQL 开始可用),这可以使用 row_number()
完成,如下所示:
select name, avg(case when rn <= 3 then value end) / avg(value)
from (
select t.*, row_number() over(partition by name order by date desc) rn from mytable t
) t
group by name
子查询为共享相同 name
的组中的每条记录分配一个等级,按 date
降序排列。然后外部查询做条件聚合。
关于mysql - GROUP BY 和 2 个限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58481685/
我是一名优秀的程序员,十分优秀!