2015-06-02 193 views
0

我有下面的情況,我需要計算下表中權重和價值計算

-------------------------------------------- 
DataField      FieldValue 
-------------------------------------------- 
DataField1      21 
DataField2      59 
DataField3      72 
DataField4      521 

提供的字段值的分數值,我們有一個參考表,它看起來像這樣

-------------------------------------------- 
ValueFrom  ValueTo  AssignedValue 
-------------------------------------------- 
0    20    1   
21    40    1   
41    60    1   
61    360   12 
361    999   1 --(1 point for every 15 after 360) 

和預期的結果應該是這個樣子

-------------------------------------------- 
DataField  FieldValue  ScoreValue 
-------------------------------------------- 
DataField1  21    2 (1+1) 
DataField2  59    3 (1+1+1) 
DataField3  72    15 (1+1+1+12) 
DataField4  521    23 (15+11)--(161 = 150+11 i.e. 10+1) 

我希望問題足夠清楚了嗎?請讓我知道是否需要更多信息。

+0

我期待在這個查詢中處理數以百萬計的數據,因此我覺得相關的子查詢可能會對我的性能產生影響,現在我正在嘗試使用右外連接來獲取所有數據另外我還有一個場景,剛剛更新 – Prakazz

+0

您正在使用哪些DBMS? Postgres的?甲骨文? –

+0

你能詳細說明你如何計算分數值嗎? – TheGameiswar

回答

0

假設表名是T1T2只有我能想到的事情是:

SELECT 
    T1.DataField as DataField, 
    T1.FieldValue as FieldValue, 
    (SELECT SUM(T2.AssignedValue) FROM T2 WHERE T2.ValueFrom < T1.FieldValue) as ScoreValue 
FROM 
T1 

如果不是,則提供更多的數據。

0

使用相關子查詢SUM

select DataField, 
     FieldValue, 
     (select sum(AssignedValue) from table2 t2 
     where t2.ValueFrom < t1.FieldValue) as ScoreValue 
from table1 t1 

或做JOIN,用GROUP BY

select t1.DataField, 
     t1.FieldValue, 
     SUM(t2.AssignedValue) as ScoreValue 
from table1 t1 
    join table2 t2 on t1.FieldValue > t2.ValueFrom 
group by t1.DataField, 
     t1.FieldValue 
0

我認爲你需要像下面

select DateField, FieldValue, sum(assignedValue) as ScoreValue 
from (
     select DateField, FieldValue, AssignedValue 
      from T1 
     inner join T2 on T2.ValueFrom <= T1.FieldValue 
     -- 
     union all 
     -- 
     select DateField, FieldValue, (FieldValue - 375)/15 as AssignedValue 
      from T1 
     where FieldValue > 375 
     -- Values 361 - 375 will pick up the first point per 15 in the first select 
    ) inlineTable 
group by DateField, FieldValue 

只是爲了解釋我的想法ere:聯合中的第一個選擇將將第一個表連接到ValueFrom小於或等於FieldValue的每一行。

360以上的值只會得到一個點,所以我們需要一些東西來解決這個問題,這些記錄應該得到超過360的15或更多的額外點。這是第二個選擇進入的地方 - 以及爲什麼它只適用於FieldValues大於375.要計算所需的額外點數,我們可以找到FieldValue和375之間的差異,然後將其除以15 - 假設數據庫中的這兩個值都定義爲int結果不應進入小數點,並且將返回一個int 。

最後我們總結所有由DateField和FieldValue分組的記錄。