我正在使用MySQL 5.0。
我想基于视图中的前一行执行计算。这可能吗?我假设不是因为在查询实际运行之前视图不存在,所以有没有解决方法,或者创建和更新表我最好的选择?
这是我错误的编码缺乏逻辑,我知道,但它显示了我想要的成就:
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`
非常感谢你! =]
答案 0 :(得分:0)
视图和表格没有那么不同。 SQL将常规视图理解为如何计算它的配方;所以它可以将它连接到相同或任何其他视图,就像它可以将表的复杂连接连接在一起。
无论哪种方式,都没有前一行这样的东西。表和视图本质上是行集,而不是有序的行序列。如果在查询中指定ORDER BY
,则在概念上强制执行该排序是应用的最后一个操作。
这并不意味着您的问题无法解决。您没有指定您的数据模型是什么,数据分布的假设等等,但一般而言:
让A
成为一个观点。让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
(可能是主键),否则这种方法会非常失败。
由于潜在的性能问题,此方法不适用于非常大的数据。在这种情况下,您应该分配一个正确排序的连续序列,这样您就可以使用新的整数列简单地减去1,就像上面的问题一样。