草庐IT

MySQL 中心针对不同的未排序记录值的三年时间间隔平均值

coder 2023-10-11 原文

我有一个看起来像这样的表:

+--------+----------+------+-----------+
|  make  |  model   | year | avg_price |
+--------+----------+------+-----------+
| Subaru | Forester | 2013 |     18533 |
| Ford   | F-150    | 2014 |     27284 |
| Ford   | F-150    | 2010 |     18296 |
| Subaru | Forester | 2012 |     16589 |
| Ford   | F-150    | 2013 |     25330 |
| Ford   | F-150    | 2011 |     20366 |
| Subaru | Forester | 2008 |      7256 |
| Ford   | F-150    | 2015 |     33519 |
| Ford   | F-150    | 2012 |     23033 |
| Subaru | Forester | 2011 |     15789 |
+--------+----------+------+-----------+

我想使用 MySQL 添加一个新列,其中包含以创纪录年份为中心的三年平均价格。完成后应该是这样的:

+--------+----------+------+-----------+---------------------+
|  make  |  model   | year | avg_price | 3_yr_center_average |
+--------+----------+------+-----------+---------------------+
| Subaru | Forester | 2013 |     18533 |               17561 |
| Ford   | F-150    | 2014 |     27284 |               28711 |
| Ford   | F-150    | 2010 |     18296 |               19331 |
| Subaru | Forester | 2012 |     16589 |               16970 |
| Ford   | F-150    | 2013 |     25330 |               25216 |
| Ford   | F-150    | 2011 |     20366 |               20565 |
| Subaru | Forester | 2008 |      7256 |                7256 |
| Ford   | F-150    | 2015 |     33519 |               30401 |
| Ford   | F-150    | 2012 |     23033 |               22910 |
| Subaru | Forester | 2011 |     15789 |               16189 |
+--------+----------+------+-----------+---------------------+

如果数据是有序的并且一切都是相同的品牌和型号,这似乎应该是直截了当的。事实上,工作表有超过 4000 种独特的制造型号年份组合,而且它们都没有按年份排序。

因此,查询不能依赖于有序记录或相邻记录以任何方式与下一条记录相关。查询需要过滤不同的品牌型号和年份,然后在三年间隔内居中取平均值,而不会在计算价差的第一年或最后一年的平均值时出现中断,因为它会丢失三年中的一两年。

任何 MySQL 提示都将不胜感激!谢谢。

最佳答案

对于每个品牌和型号,我们可以尝试加入两次,将之前和之后的年份与当前年份放在一行中。然后,子查询并取三年的平均价格:

SELECT make, model, year, avg_price,
    (avg_price + last_price + next_price) / (1.0 + last_cnt + next_cnt) AS 3_yr_center_average
FROM
(
    SELECT t1.make, t1.model, t1.year, t1.avg_price,
        COALESCE(t2.avg_price, 0) AS last_price,
        COALESCE(t3.avg_price, 0) AS next_price,
        CASE WHEN t2.avg_price IS NOT NULL THEN 1 ELSE 0 END AS last_cnt,
        CASE WHEN t3.avg_price IS NOT NULL THEN 1 ELSE 0 END AS next_cnt
    FROM yourTable t1
    LEFT JOIN yourTable t2
        ON t1.make = t2.make AND t1.model = t2.model AND t1.year = t2.year + 1
    LEFT JOIN yourTable t3
        ON t1.make = t3.make AND t1.model = t3.model AND t1.year = t3.year - 1
) t
ORDER BY
    make, model, year;

Demo

请注意,关于该品牌和型号的最后(或第一)年的记录应该发生什么,您的数据中存在一个边缘案例。在这种情况下,三年移动平均线只有两年可用。在这种情况下,我假设您实际上只报告两年移动平均线就可以了。例如,对于 2013 年的 Subaru Forester,我报告了 17561 的三年移动平均值,这实际上是 2013 年价格 18533 和之前 2012 年价格的平均值 16589

关于MySQL 中心针对不同的未排序记录值的三年时间间隔平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48416148/

有关MySQL 中心针对不同的未排序记录值的三年时间间隔平均值的更多相关文章

  1. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  2. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  3. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  4. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  5. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  6. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

  7. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  8. ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序 - 2

    我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby​​做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排

  9. ruby - 从 sinatra 中的 before do block 返回不同的值 - 2

    有没有办法在sinatra的beforedoblock中停止执行并返回不同的值?beforedo#codeishere#Iwouldliketo'return"Message"'#Iwouldlike"/home"tonotgetcalled.end//restofthecodeget'/home'doend 最佳答案 beforedohalt401,{'Content-Type'=>'text/plain'},'Message!'end如果你愿意,你可以只指定状态,这里有状态、标题和正文的例子

  10. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

随机推荐