2013-10-08 24 views
1

我知道这是不可能的直接。 但我想通过任何间接的方法来实现这一点,如果可能的话。我想查看行号或查看变量

其实我想添加下面的查询来查看哪些抛出错误,子查询不允许在视图中。

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 

所以,我想我会子查询作为独立的看法,但认为再​​次抛出错误的变量不考虑不允许的。请帮助克服这种情况。

Thanx提前

回答

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)对结果集进行分组。统计每个组中的行会给你相应的行号。

所以,如果有这样的一个表:

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子句中的子查询),因此,你会赞成bably需要定义的排序查询作为单独的视图:

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

+0

哇,我现在非常沮丧!如果我可以使用postgres,我会没事的。我不知道为什么mysql还没有ROW_NUMBER函数。 – dcunited001

+0

我的问题是,我在Ruby on Rails中使用了视图支持的模型,所以我对我能做的事情有一些真正的限制。我在这张桌子上有13,000行,所以三角形连接不适合我。因为我使用的是一个视图,变量也不是。到目前为止,我能够解决这个问题的唯一方法就是使用多个连接,如上所述。然而,客户现在需要6条记录,而不是仅仅3条。所以我真的不知道我要做什么.... SMH – dcunited001

+0

为什么你不能切换到不同的产品?该项目已经太大了? –