2017-07-28 71 views
0

我试图创建并填充视图,但有一些棘手的标准会让我减慢很多。 所有流入的数据都来自数据库中的其他表。根据行间条件查看人口

我需要挑选一排只有当另一行(同桌)符合给定约束条件:

  • 它共享代码:例如,给定一个记录,我如果把它同一张表中的另一个记录;
  • 它有一定的TYPE;
  • 它的日期与另一个TYPE匹配,但代码相同;
  • 它的值大于匹配记录;

例子:

1. CODE1 - TYPE.A - 01/12 - 200 
2. CODE1 - TYPE.B - 01/12 - 300 
3. CODE1 - TYPE.B - 01/09 - 300 
4. CODE1 - TYPE.B - 01/12 - 100 
5. CODE2 - TYPE.B - 01/12 - 200 
6. CODE1 - TYPE.A - 01/12 - 300 

上面的记录,因为它共享与TYPE的 “A” 的行(抑制1)的代码,我将只需要行#2,它具有一定的TYPE “B”(R2),它与所述记录(R3)具有匹配的日期,并且它的值大于匹配记录(300> 200)。

  • row#3它不好,因为它有错误的日期;
  • row#4它不好,因为它有一个较低的值;
  • 第5行有错误的代码;
  • 第6行有错误的TYPE;

这只是给你一个整个场景的图片。 我无法想到的是如何在同一张表中进行这种行间检查。

我希望我解释一下自己,让你知道这个问题!除非你有一列没有排 “#2”:

+0

问题它提供了这个顺序。 –

+0

该表由CODE订购。在问题中的rowNum是为了让它不那么凌乱,你哟读它:) – pedro

+0

你需要一个为你给我们展示的顺序。 –

回答

1

如果我理解正确的话,你可以用一个join做到这一点:

select t.* 
from t join 
    t tt 
    on t.code = tt.code and 
     t.date = tt.date 
     t.type = 'Type.B' and 
     tt.type = 'Type.A' and 
     t.value > tt.value; 

或者等价地,exists

select t.* 
from t 
where exists (select 1 
       from tt 
       where t.code = tt.code and 
        t.date = tt.date 
        t.type = 'Type.B' and 
        tt.type = 'Type.A' and 
        t.value > tt.value 
      ); 
+0

好吧,听起来很有趣!我会尽快给它一个! – pedro

+0

为第一个而去,看起来像在工作! 非常感谢! – pedro