1

我正在使用 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`

非常感谢!=]

4

1 回答 1

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 子句有效地表示“ and之间没有任何内容ba”。并且因为b.col被要求小于a.col,这意味着这是您想要b的唯一记录。a

我重复一遍,确保colNOT NULLand UNIQUE(in 可能是主键),否则这种方法将失败。

由于潜在的性能问题,此方法不适用于非常大的数据。在这种情况下,您可能应该分配一个正确排序的连续序列,这样您就可以像上面的问题一样使用新的整数列简单地减去 1。

于 2012-06-19T20:47:58.590 回答