2017-07-28 73 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