我正在使用 MySQL 5.0。
我想根据 View 中的前一行执行计算。这可能吗?我假设不是因为在查询实际运行之前 View 不存在,所以是否有解决方法,或者创建和更新表是我最好的选择?
我知道这是我的错误代码,缺乏逻辑,但它显示了我想要完成的事情:
CREATE VIEW `Master Facebook Data` tt1 AS SELECT
t1.id AS `Client ID`,
t1.name AS `Client Name`,
t1.`Date`,
avg(t1.`Daily People Talking About This`) AS `Avg Daily Talk`,
(((tt1.`Avg Daily Talk`-IFNULL(tt2.`Avg Daily Talk`, 0)))/tt1.`Avg Daily Talk`) AS `Change in Talk`,
avg(t1.`Weekly Total Reach`) AS `Avg Weekly Reach`,
(((tt1.`Avg Weekly Reach`-IFNULL(tt2.`Avg Weekly Reach`, 0)))/tt1.`Avg Weekly Reach`) AS `Change in Reach`,
avg(t1.`Daily Viral Reach`) AS `Avg Daily Viral`,
(((tt1.`Avg Daily Viral`-IFNULL(tt2.`Avg Daily Viral`, 0)))/tt1.`Avg Daily Viral` AS `Change in Viral`
FROM `clients` t1
JOIN `FB Exports - Key Metrics` t2
ON t1.`id` = t2.`client`
LEFT OUTER JOIN `Master Facebook Data` tt2
ON tt1.`Client ID` = tt2.`Client ID`
AND month(tt1.`Date`)-month(tt2.`Date`)=1
GROUP BY t2.`client`, month(t2.`Date`)
ORDER BY t2.`client`, t2.`Date`
非常感谢! =]
最佳答案
View 和表并没有什么不同。 SQL 将常规 View 理解为如何计算它的方法;因此它可以将它连接到相同或任何其他 View ,就像它可以将复杂的表连接在一起一样。
无论哪种方式,都没有前一行这样的东西。表和 View 本质上是行集,而不是有序的行序列。如果您在查询中指定 ORDER BY
,强制执行该排序在概念上是最后应用的操作。
这并不意味着您的问题无法解决。您不指定您的数据模型是什么、对数据分布的假设等,但一般而言:
让 A
成为一个 View 。让 col
成为您要排序的不可为空的唯一约束列(用于定义什么是“上一行”)。现在看看这种查询。
A AS a
LEFT JOIN A AS b ON b.col < a.col
LEFT JOIN A AS c ON c.col < a.col AND c.col > b.col
...
WHERE c.col IS NULL
因为 col
是不可空的,WHERE 子句实际上是说“b
和 a
”。因为 b.col
被要求小于 a.col
,这意味着 b
是 之前的唯一记录a
这就是你想要的。
我再说一遍,确保 col
是 NOT NULL
和 UNIQUE
(in 可以是一个主键),否则这个方法会非常好失败。
由于潜在的性能问题,此方法不适用于非常大的数据。在这种情况下,您可能应该分配一个正确排序的连续序列,这样您就可以像上面的问题一样使用新的整数列简单地减去 1。
关于MySQL - 将 View 加入 ITSELF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11108584/