我希望视图中的行号或视图中的变量

时间:2013-10-08 06:44:58

标签: mysql view row-number

我知道这不可能直接。 但是如果可能的话,我希望通过任何间接方法实现这一点。

实际上我想添加以下查询来查看哪个抛出错误,在视图中不允许子查询。

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查询作为单独的视图,但是再次抛出了视图中不允许的变量的错误。请帮助克服这种情况。

提前完成

1 个答案:

答案 0 :(得分:1)

您可以尝试使用三角形连接+计数方法来分配行号。它可能在大型数据集上表现不佳,但您应该能够通过几个视图实现所有内容(如果您认为除了视图之外没有其他方法可以执行您想要做的事情)。这个想法如下:

  1. 数据集在master.key >= secondary.key的条件下与自身连接,其中master是实际从中提取详细数据的实例,secondary是另一个实例用于提供行号的同一表格。

  2. 根据该条件,第一行 * master行将与一行secondary行连接,第二行与两行连接,第三行与三行连接等等。

  3. 此时,您可以对主key列的结果集以及输出中所需的列进行分组(尽管in MySQL it would be enough to group by the master key only)。计算每个组中的行将为您提供相应的行号。

  4. 所以,如果有这样的表:

    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的顺序。