MySQL - 在相关子查询中限制聚合数据时嵌套子查询的替代方案

2023-12-13

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

DataTable
+------------+------------+------------+
| Date       | DailyData1 | DailyData2 |
+------------+------------+------------+
| 2012-01-23 |     146.30 |     212.45 |
| 2012-01-20 |     554.62 |     539.11 |
| 2012-01-19 |     710.69 |     536.35 |
+------------+------------+------------+

我正在尝试创建一个视图(称之为AggregateView),这将针对每个日期和每个数据列显示一些不同的聚合。例如,select * from AggregateView where Date = '2012-01-23'可能会给出:

+------------+--------------+----------------+--------------+----------------+
| Date       | Data1_MTDAvg | Data1_20DayAvg | Data2_MTDAvg | Data2_20DayAvg |
+------------+--------------+----------------+--------------+----------------+
| 2012-01-23 |       697.71 |         566.34 |       601.37 |         192.13 |
+------------+--------------+----------------+--------------+----------------+

where Data1_MTDAvg shows avg(DailyData1)对于 1 月 23 日之前的 1 月每个日期,以及Data1_20DayAvg显示相同的内容,但针对表中的前 20 个日期。我不是 SQL 忍者,但我认为最好的方法是通过子查询。 MTD 平均值很简单:

select t1.Date, (select avg(t2.DailyData1) 
                 from DataTable t2 
                 where t2.Date <= t1.Date 
                   and month(t2.Date) = month(t1.Date) 
                   and year(t2.Date) = year(t1.Date)) Data1_MTDAvg 
from DataTable t1;

但由于需要限制返回结果的数量,我对 20 天的平均值很着迷。请注意,表中的日期是不规则的,所以我不能使用日期间隔;我需要表中的最后 20 条记录,而不仅仅是过去 20 天的所有记录。我找到的唯一解决方案是使用嵌套子查询首先限制所选记录,然后取平均值。

单独的子查询适用于单独的硬编码日期:

select avg(t2.DailyData1) Data1_20DayAvg 
from (select DailyData1 
      from DataTable 
      where Date <= '2012-01-23' 
      order by Date desc 
      limit 0,20) t2;

但尝试将其嵌入作为更大查询的一部分会失败:

select t1.Date, (select avg(t2.DailyData1) Data1_20DayAvg 
                 from (select DailyData1 
                       from DataTable 
                       where Date <= t1.Date 
                       order by Date desc 
                       limit 0,20) t2) 
from DataTable t1;
ERROR 1054 (42S22): Unknown column 't1.Date' in 'where clause'

通过搜索,我得到的印象是,您不能使用相关子查询作为from条款,我认为这就是问题所在。另一个问题是我不确定 MySQL 是否会接受包含from子查询中的子句。有没有办法限制我的聚合选择中的数据而不诉诸子查询,以解决这两个问题?


不,您不能在FROM条款。但您可以在以下位置使用它们ON状况:

SELECT AVG(d.DailyData1) Data1_20DayAvg 
       --- other aggregate stuff on d (Datatable)
FROM 
      ( SELECT '2012-01-23' AS DateChecked
      ) AS dd
  JOIN
      DataTable AS d
    ON
      d.Date <= dd.DateChecked
    AND
      d.Date >= COALESCE( 
      ( SELECT DailyData1 
        FROM DataTable AS last20 
        WHERE Date <= dd.DateChecked 
          AND (other conditions for last20)
        ORDER BY Date DESC 
        LIMIT 1 OFFSET 19
      ), '1001-01-01'   )
WHERE (other conditions for d Datatable)

类似地,对于许多日期:

SELECT dd.DateChecked 
     , AVG(d.DailyData1) Data1_20DayAvg 
       --- other aggregate stuff on d (Datatable)
FROM 
      ( SELECT DISTINCT Date AS DateChecked
        FROM DataTable 
      ) AS dd
  JOIN
      DataTable AS d
    ON
      d.Date <= dd.DateChecked
    AND
      d.Date >= COALESCE( 
      ( SELECT DailyData1 
        FROM DataTable AS last20
        WHERE Date <= dd.DateChecked 
          AND (other conditions for last20)
        ORDER BY Date DESC 
        LIMIT 1 OFFSET 19
      ), '1001-01-01'   )
WHERE (other conditions for d Datatable)
GROUP BY 
      dd.DateChecked 

两个查询都假设Datatable.Date has a UNIQUE约束。

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

MySQL - 在相关子查询中限制聚合数据时嵌套子查询的替代方案 的相关文章

  • pyspark.sql.functions.window 函数的“startTime”参数和 window.start 有何作用?

    示例如下 df spark createDataFrame 1 2017 05 15 23 12 26 2 5 1 2017 05 09 15 26 58 3 5 1 2017 05 18 15 26 58 3 6 2 2017 05 15
  • 从 Presto 中的 JSON 列获取特定值

    我有一个带有 JSON 列的表points其中一行为 0 0 2 1 1 2 2 0 5 15 1 2 20 0 7 我想获取键的值 1 and 20 并将它们存储为别名 例如first and second在查询中 到目前为止我所做的是
  • 错误代码:1062。重复条目“PRIMARY”

    因此 我的教授给了我表格将其插入数据库 但是当我执行他的代码时 MySQL 不断给出错误代码 1062 这是冲突表和插入 TABLES CREATE TABLE FABRICANTES COD FABRICANTE integer NOT
  • SQL Server 2008 GUID 列全为 0

    我希望这是我做的一个简单的傻事 我的数据库中有一个表 设置如下 column name widget guid data type uniqueidentifier allow nulls false default value newid
  • PostgreSQL 窗口函数:row_number() over(按 col2 分区 col 顺序)

    以下结果集源自具有一些连接和联合的 SQL 查询 SQL 查询已经对 Date 和 game 上的行进行了分组 我需要一列来描述按日期列分区的游戏的尝试次数 Username Game ID Date johndoe1 Game 1 100
  • 条件对列表的 In 子句

    有一个表 我需要通过在配对值列表中应用和条件来获取分页记录 下面是解释 假设我有一堂课Billoflading其中有各个领域 表中两个重要字段是 tenant billtype 我有一个包含值的对列表 tenant1 billtype1 t
  • MySQL 薛定谔表:存在,但不存在

    我遇到了最奇怪的错误 有时 在创建或更改表时 我会收到 表已存在 错误 但是 DROP TABLE 返回 1051 未知表 所以我得到了一个无法创建 无法删除的表 当我尝试删除数据库时 mysql 崩溃了 有时它有助于创建另一个具有不同名称
  • MySQL 组合两个查询

    我有两个 MySQL 查询 QUERY SELECT sodnik 1 FROM prihodnji krog WHERE file id 8778 AND sodnik 1 UNION SELECT sodnik 2 FROM priho
  • PHP-MySQLi 连接随机失败并显示“无法分配请求的地址”

    大约两周以来 我一直在处理 LAMP 堆栈中最奇怪的问题之一 长话短说 与 MySQL 服务器的随机连接失败并显示错误消息 Warning mysqli real connect HY000 2002 Cannot assign reque
  • 转义用户数据,无需魔法引号

    我正在研究如何在来自外部世界的数据被用于应用程序控制 存储 逻辑等之前正确地对其进行转义 显然 随着 magic quote 指令在 php 5 3 0 中很快被弃用 并在 php6 中被删除 对于任何想要升级并进入新语言功能 同时维护遗留
  • DataTables 第 2 页的分页未调用放大弹出窗口

    所以我有这个启用分页的数据表 我编码了一种方式 以便用户可以编辑表的行 当用户调用它在放大弹出窗口中打开的编辑页面时 它在第 1 页 从第 2 页起都运行良好 DataTable 及其前面停止调用 Magnific Popup 我只是不明白
  • 从一张表更新并插入另一张表

    我有两张桌子 table1 ID 代码 姓名 table2 ID 代码 姓名 具有相同的列 我想将数据从 table1 插入到 table2 或更新列 如果 table2 中存在 table1 ID table2 ID 执行此操作的简单方法
  • 蟒蛇 | MySQL | AttributeError:模块“mysql.connector”没有属性“connect”

    我正在学习 python 中的一个新库 mysql 我尝试执行以下命令 import mysql connector mydb mysql connector connect host localhost user root passwd
  • Monkeyrunner/jython 中未找到 JDBC 驱动程序错误

    我需要在中插入一些东西DB 我在用着JDBC as a connector jython the script mysql数据库和脚本正在运行CentOS 我的代码看起来像这样 from com android monkeyrunner i
  • MySQL 两种日期格式之间的转换

    用户将以这种格式输入日期 2017 年 2 月 17 日 存储在 mysql 数据库中的日期格式如下 2015 02 17 00 00 00 我想做的是 SELECT FROM insurance where DATE FORMAT in
  • 批处理文件并与数据库比较

    目前我正在开发一个 Spring Boot 应用程序 该应用程序定期尝试处理包含用户数据的文件 其中每行都包含userId and departamentId隔开 例如123534 13 该文件将包含数百万条记录 我的要求是以这样的方式将此
  • sql直接获取表行数的方法

    stackoverflow 的朋友们大家好 我的例行程序中有一个我认为不必要的步骤 假设您想从图库中获取所有图像 并限制每页一定数量的图像 db PDO object start pagenum x images per page limi
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • 总结同一个 SQL 表上的两个条件

    给定一个 SQL 表 Transactions ID INT COMPANY ID INT STATUS INT where STATUS IN 0 1 表示免费交易并且STATUS IN 2 3 表示可计费交易 简单的 我希望 ANSI
  • 错误 1305 (42000):保存点...不存在

    我的 MYSQL 数据库中有这个 SQL 存储过程为空 所以我猜没有隐式提交 DROP PROCEDURE IF EXISTS doOrder DELIMITER CREATE PROCEDURE doOrder IN orderUUID

随机推荐

  • QuickGraph - 是否有算法可以找到一组顶点的所有父级(直到根顶点)

    在 QuickGraph 中 是否有算法可以查找一组顶点的所有父级 直到根顶点 换句话说 所有顶点的下方某处 在通往叶节点的路上 都有一个或多个顶点输入 因此 如果顶点是节点 并且边是依赖关系 则找到将受到给定节点集影响的所有节点 如果不是
  • 如何使用 Visual Studio 2019 面向 Windows 7?

    我想使用 Visual Studio 2019 来享受最新的 C 新增功能 但针对的是 Windows 7 我使用 VS 2019 向导创建了一个 Windows C 应用程序 在 Windows 10 上运行 A targetver h文
  • URLEncoder.encode() 和空格?

    我的服务器上有一个名为 some image png 名字里有一个空格 当我在浏览器 chrome 中输入 url 时 它会将空格转换为 20 some 20 png 当我从应用程序中使用 URLEncoder encode some im
  • GStreamer 同时录制和查看流

    我手头有一项奇怪的任务 我已经尝试了一切 我想知道你是否能帮忙 我的任务是抓取 RaspPi 发出的流并将其保存到我的电脑上 但是 我需要同时查看和保存它 这可以查看它 gst launch 1 0 udpsrc 端口 5000 应用程序
  • 相关子查询中的 MySQL LIMIT

    我有一个相关子查询 它将返回数量列表 但我需要最高数量 而且只需要最高数量 因此 我尝试引入 order by 和 LIMIT 1 来实现此目的 但 MySQL 抛出一个错误 指出它还不支持子查询中的限制 关于如何解决这个问题有什么想法吗
  • Qt5 | Cmake |对`QPrinter::QPrinter(QPrinter::PrinterMode)的未定义引用

    我正在为 qt 应用程序准备 cmake 构建 我在哪里使用以下结构 libMyApp 它使用 SET QT5 MODULES Widgets PrintSupport Network XmlPatterns FIND PACKAGE Qt
  • 基于索引模式到间接寻址模式的转换(x86 汇编)

    我目前正在努力将示例从复杂的间接寻址模式更改为简单的间接寻址模式片段 但是 我遇到了基于模式的示例 我无法 转换 Code move eax 28 esp 我试过了 addl 28 esp movl eax esp 这会产生分段错误 我不知
  • 如何在Linux服务器上的80端口启动node.js?

    当我尝试在端口 80 上启动节点时 错误告诉我该端口正在使用中 我想那是阿帕奇 接管 端口 80 并在服务器重新启动后保持这种状态的正确方法是什么 Linux xxxx com 2 6 32 5 amd64 1 SMP 6 月 14 日星期
  • R textConnection:“参数‘对象’必须解析为单个字符串”

    我想将字符串列表转换为数据框 但是 我收到此错误 gt read csv textConnection c id name count 6289 aa 16 6269 bb 8 6269 cc 8 6269 dd 8 6610 ee 4 E
  • 防止 jQuery 多重引用

    我正在开发 DNN 模块 并且在某些模块中使用 jQuery 我将 jQuery 引用添加到每个 ascx 文件的顶部 顺便说一句 当用户将多个模块添加到每次添加模块时引用的页面时 这种情况给出一些错误 当我从另一个模块底部的模块中删除引用
  • Outlook 将电子邮件标记为垃圾邮件

    我知道 我听起来像垃圾邮件发送者 但这些电子邮件对于在我们开发的这个网站上注册帐户的人来说是完全合法的电子邮件确认 这些电子邮件都会发送到各个邮件提供商 gmail yahoo aol hotmail live 但它们总是被定向到 Outl
  • 如何使用winsound同时播放多个声音?

    我正在尝试使用内置的winsound 库将多个声音叠加在一起 我开始我的第一个声音 winsound PlaySound test1 wav winsound SND FILENAME winsound SND ASYNC 当我尝试启动其他
  • 动画分割面板分隔线

    我有一个水平分割窗格 我想在单击按钮时更改分隔线位置 以便创建某种 幻灯片 动画 分隔线将从 0 完全向左 开始 单击时它会打开到 0 2 当我再次单击时 它会返回到 0 现在我实现了这一点 我只是使用 spane setdividerPo
  • 限制 = 1 = 1ms,限制 > 1 = 150 ms(芒果融化)

    使用 MongoDB Native Driver 查询如下 mo post find us us utc lte utc fields geo 0 bin 0 flg 0 mod 0 edt 0 hint us 1 utc 1 sort u
  • 如何使用 jQuery 禁止输入或粘贴字符(并替换它们)?

    我正在尝试找到一种方法来替换表单中所有输入字段 本质上是文本框和文本区域 中输入或粘贴的不允许的字符 每当用户粘贴包含一个或多个不允许的字符的文本时 我都希望将该字符替换为空字符串 但保持文本的其余部分完好无损 如果他们不断地输入字符 我只
  • 当折叠可见时,如何通过单击主体隐藏我的折叠 Bootstrap 3 导航栏?

    我正在为我将去工作的机构制作一个 WordPress 网站 我使用 Bootstrap 3 0 并创建了一个响应式菜单 如何在折叠和可见时隐藏菜单 第二张图片 单击主体 并且菜单按钮更改其颜色 只有折叠可见 bootstrap js 和 j
  • 使用 RDTSC 在 C 中计算 CPU 频率始终返回 0

    我们的讲师向我们提供了以下代码 以便我们可以测量一些算法的性能 include
  • UIScrollView 边界尚未在“viewDidLoad”中调整大小

    我有一个 UIViewController 子类 其视图在 NIB 文件中配置 该视图有一个 UIScrollView 子视图 UIScrollView 几乎占据了整个 NIB 文件 但它的超级视图作为子视图添加到一个更小的视图 在不同的
  • 组合框架:如何在继续之前异步处理数组的每个元素

    我在使用 iOS 组合框架时遇到了一些心理障碍 我正在将一些代码从远程 API 的 手动 获取转换为使用合并 基本上 API 是 SQL 和 REST 实际上它是 Salesforce 但这与问题无关 该代码用来执行的操作是调用带有完成处理
  • MySQL - 在相关子查询中限制聚合数据时嵌套子查询的替代方案

    我有一张看起来像这样的表 DataTable Date DailyData1 DailyData2 2012 01 23 146 30 212 45 2012 01 20 554 62 539 11 2012 01 19 710 69 53