如何解决日期时间序列的 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 举报,一经查实,本站将立刻删除。