MySQL-将视图连接到自身

MySQL-将视图连接到自身,mysql,join,views,self-join,Mysql,Join,Views,Self Join,我正在使用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

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

非常感谢!=]

视图和表没有那么大的不同。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不为NULL,并且在中是唯一的,因为它可能是主键,否则此方法将异常失败


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

请原谅,但我想我的问题用错了词!我并不是说我真的在使用前一行,而是说,前一个月,它恰好来自前一行。我上面的代码中已经显示了计算该值的代码。我真正想问的是如何将视图连接到自身,以便基于内部/左侧/任何连接执行计算?例如,我该怎么做呢?:创建查看Facebook主数据tt1作为从客户端t1选择col1作为column1加入FB导出-关键指标t2在t1.id=t2.client LEFT外部加入Facebook主数据tt2在tt1.client id=tt2.client id和montht1.Date-montht2.Date=1@likelepers-可以用monthDate代替col只要列不是NULL和唯一的。如果您需要一个没有任何间隙的数字序列,请随意进一步简化。我是说,你可以像对待桌子一样对待视图,它会起作用。Hrrrm。。。。我知道视图的工作方式与表相同。那么,您是否介意帮助我理解为什么这段代码不起作用&如何可能去纠正它?创建视图主数据作为选择。。。从表左外部联接主数据tt1开始。。。MySql说主数据不存在,我认为这是因为这个语句的存在是为了创建它。是否有一个变通方法,以便我可以自行加入此视图?废话,我就是不知道该怎么解决这个问题。谢谢@likelepers-创建两个视图。创建一个对应于我答案中的A。使用我的答案中的SQL创建另一个名称,使其具有不同的名称,但一定要阅读所有内容并适应您的需要。自连接意味着将A与A连接以产生B。它并不意味着将A与B连接以产生A;后者是不可能的,幸运的是你的问题不需要它。