我知道这不可能直接。 但是如果可能的话,我希望通过任何间接方法实现这一点。
实际上我想添加以下查询来查看哪个抛出错误,在视图中不允许子查询。
select T1.Code,
T1.month,
T1.value,
IfNull(T2.Value,0)+IfNull(T3.value,0) as value_begin
from (select *,@rownum := @rownum + 1 as rownum
from Table1
Join (SELECT @rownum := 0) r) T1
left join (select *,@rownum1 := @rownum1 + 1 as rownum
from Table1
Join (SELECT @rownum1 := 0) r) T2
on T1.code = T2.code
and T1.rownum = T2.rownum + 1
left join (select *,@rownum2 := @rownum2 + 1 as rownum
from Table1
Join (SELECT @rownum2 := 0) r) T3
on T1.code = T3.code
and T1.rownum = T3.rownum + 2
Order by T1.Code,T1.rownum
所以,我以为我会将Sub查询作为单独的视图,但是再次抛出了视图中不允许的变量的错误。请帮助克服这种情况。
提前完成
答案 0 :(得分:1)
您可以尝试使用三角形连接+计数方法来分配行号。它可能在大型数据集上表现不佳,但您应该能够通过几个视图实现所有内容(如果您认为除了视图之外没有其他方法可以执行您想要做的事情)。这个想法如下:
数据集在master.key >= secondary.key
的条件下与自身连接,其中master
是实际从中提取详细数据的实例,secondary
是另一个实例用于提供行号的同一表格。
根据该条件,第一行 * master
行将与一行secondary
行连接,第二行与两行连接,第三行与三行连接等等。
此时,您可以对主key
列的结果集以及输出中所需的列进行分组(尽管in MySQL it would be enough to group by the master key only)。计算每个组中的行将为您提供相应的行号。
所以,如果有这样的表:
CREATE TABLE SomeTable (
ID int,
Value int
);
将行号分配给表的查询可能如下所示:
SELECT m.ID, m.Value, COUNT(*) AS rownum
FROM SomeTable AS m
INNER JOIN SomeTable AS s ON m.ID >= s.ID
GROUP BY m.ID, m.Value
;
由于您似乎想要自行加入排名的行集(以及两次),因此需要将上述查询用作派生表,并且因为您还希望整个事物都是视图(不是允许FROM子句中的子查询),您可能需要将排序查询定义为单独的视图:
CREATE RankingView AS
SELECT m.ID, m.Value, COUNT(*) AS rownum
FROM SomeTable AS m
INNER JOIN SomeTable AS s ON m.ID >= s.ID
GROUP BY m.ID, m.Value
;
然后在主查询中引用该视图:
CREATE SomeOtherView AS
SELECT ...
FROM RankingView AS t1
LEFT JOIN RankingView AS t2 ON ...
...
This SQL Fiddle demo显示了该方法及其用法。
关于您的具体情况的一点说明。您的表可能需要在分区中分配的行号,即每个不同的Code
行组都需要自己的行号集。这意味着您的排名视图应指定加入条件,如下所示:
ON m.Code = s.Code AND m.Month >= s.Month
请注意,在这种情况下,假设每个月Code
是唯一的。如果不是这种情况,您可能首先需要创建一个视图,按Code, Month
对原始数据集进行分组,并对该视图进行排名,而不是对原始数据集进行排名。
* 根据key
的顺序。