日期时间序列的 SQL 视图

如何解决日期时间序列的 SQL 视图

因此要处理工具和显示库的一系列限制。

我有一个有效的附加查询。它采用交易表并生成时间序列输出,计算交易类型并按天汇总金额,以便使用库显示图表。

问题在于库的嵌入式 sql 客户端有局限性。 所以它需要是一个库可以访问的存储的 MysqL/MariaDB 视图。 唯一的问题是,由于 MysqL/MariaDB 的限制,尝试保存视图时抛出错误

#1351 - 视图的 SELECT 包含变量或参数

我假设前进的道路是将有问题的 var/parm 填充到自定义函数中,或者将查询拆分为多个视图以处理任何限制之外的子查询。最终它需要是一个调用的视图/查询,以便库可以处理它。

我会坦率地承认我对自定义函数真的很生疏,因为我从来都不是它们的忠实粉丝。我有太多的 SELECTS 来确定哪些 [one/ones] [is/are] 导致数据库阻塞,所以我可以使用一些想法/帮助。

    SELECT DATE(cal.date) AS Date,SUM(`amount`) as Total,(SELECT COUNT(a.status)
            FROM `transactions`
            WHERE DATE(created_at) = DATE(cal.date)
              AND txn_type = 'payment'
              AND status = 'pending') as p,(SELECT COUNT(a.status)
            FROM `transactions`
            WHERE DATE(created_at) = DATE(cal.date)
              AND txn_type = 'payment'
              AND status = 'Failed') as f,(SELECT COUNT(a.status)
            FROM `transactions`
            WHERE DATE(created_at) = DATE(cal.date)
              AND txn_type = 'payment'
              AND status = 'complete') as c,(SELECT COUNT(a.status)
            FROM `transactions`
            WHERE DATE(created_at) = DATE(cal.date)
              AND txn_type = 'payment'
              AND status = 'refunded') as r
FROM ( SELECT SUBDATE(Now(),INTERVAL 90 DAY) + INTERVAL xc DAY AS date 
      FROM ( SELECT @xi:=@xi+1 as xc from ( 
           SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc1,(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc2,(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc3,(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc4,(SELECT @xi:=-1) xc0 ) 
      xxc1 ) 
cal 
LEFT JOIN `transactions` a ON DATE(a.`created_at`) = DATE(cal.date) 
WHERE cal.date <= Now() 
GROUP BY DATE(cal.date) 
ORDER BY cal.date DESC

解决方法

您在生成数字序列时会出现视图中的变量问题。有一种更好的方法可以做到这一点。

创建自己的这个视图。它给出了一个从 0 到 124 的数字序列。

CREATE OR REPLACE VIEW seq_0_to_124 AS 
SELECT A.N + 5*(B.N + 5*(C.N)) AS seq
  FROM (SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS A
  JOIN (SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS B
  JOIN (SELECT 0 AS N UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) AS C;

如果您使用 MariaDB fork of MySQL,则不必创建此视图:它有一个 sequence storage engine,您可以使用内置的虚拟表,例如 seq_0_to_90

然后您可以创建另一个 cal 视图以获取从 90 天前到现在的天数。

CREATE OR REPLACE VIEW cal AS 
 SELECT (CURDATE() - INTERVAL 90 DAY + INTERVAL seq_0_to_124.seq DAY)  `date`
   FROM seq_0_to_124
  WHERE seq_0_to_124.seq <= 90;       

看看这个in a fiddle here

最后,您可以在查询中使用 cal 视图。

SELECT whatever
FROM cal 
LEFT JOIN `transactions` a   ON a.`created_at` =  cal.date 
WHERE cal.date <= NOW() 
GROUP BY cal.date 
ORDER BY cal.date DESC

当然,如果您愿意,您也可以将这些作为子查询嵌入到您的查询中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?