2014-02-05 68 views
1

我建立了一個模式與SQL小提琴:SQLite的 - 馬克斯(列)整蠱查詢

SQL Fiddle - Schema

我們在TestTable的這些列:

  1. ID作爲主鍵的 [int](未使用 - >不重要
  2. 結束 [int] - 如果一個新流寫入表中,但最後一次的值爲'0'且最後一個值爲'1'。這是指輸入流在這裏完成。
  3. time_abs [int] - 絕對時間(例如以分步)。
  4. r_m [雙] - 是SUMED了隨時間
  5. T_R [雙]的質量比 - 不要緊
  6. [串] - 也無所謂這裏
  7. X0 [字符串] - 出發(例如,其中不落入水?)
  8. X1 [字符串] - 目的地(?例如,其中確實在水流)

正如你可以在SQL小提琴架構看到我們查詢每質量在一定的位置,並在一定的時間是這樣的:

SELECT 
(SELECT (SELECT total(r_m) 
     FROM testtable 
     WHERE time_abs=11 AND end=0 AND x1='vessel2') + 
     (SELECT total(r_m) 
     FROM testtable 
     WHERE end=1 AND time_abs <=11 AND x1='vessel2') 
) 
- 
(SELECT (SELECT total(r_m) 
     FROM testtable 
     WHERE time_abs=11 AND end=0 AND x0='vessel2') + 
     (SELECT total(r_m) 
     FROM testtable 
      WHERE end=1 AND time_abs <=11 AND x0='vessel2') 
) 

效果很好,速度快。

但是我們現在要查詢什麼是r_m在一定時間範圍最大

E.g. 僞代碼

SELECT max(total(r_m)) 
WHERE time_abs BETWEEN 1 AND 30 & SELECT time_abs WHERE r_m=max ... 

使得該僞查詢的結果是(123,13-24)(最大(總質量)時間跨度,其中總質量=最大)(在SQL Fiddle Schema中手動檢查)。

任何想法?

+0

你爲什麼僅彙總舊流入的流結束('end = 1')? – Andomar

+0

因爲流入流增加,直到完成。所以'end = 1'是舊流入的總質量。我們只需要這個值,因爲它包含了所有'end = 0'流的信息。 – StefanOverFlow

回答

1

這裏有一個查詢,顯示5和26秒之間在容器2級:

select times.time_abs 
,  sum(
     case when x1 = 'vessel2' and ([end] = 1 or times.time_abs = tt.time_abs) 
      then r_m else 0 end - 
     case when x0 = 'vessel2' and ([end] = 1 or times.time_abs = tt.time_abs) 
      then r_m else 0 end 
     ) as lvl 
from (
     select distinct time_abs 
     from testtable 
     where time_abs between 5 and 26 
     ) times 
join testtable tt 
on  tt.time_abs <= times.time_abs 
     and 'vessel2' in (tt.x0, tt.x1) 
group by 
     times.time_abs 

要只顯示最大值,您可以:

select max(lvl) 
from (
     ...query from above... 
     ) as SubQueryAlias 

Live example at SQL Fiddle.

+0

它的工作原理!泰!但是當我在一個大約2000萬行,更大的時間跨度的大桌子上嘗試時,它會很慢。是否有可能以某種方式加速? – StefanOverFlow

+0

嘗試各種索引,例如'(time_abs,end,x0,x1,r_m)','(x0,time_abs,end,r_m)','(x1,time_abs,end,r_m)'和'(end,time_abs ,x0,x1,r_m)'? – Andomar

+0

我已經嘗試過這一段時間_1_到_110_,現在需要4秒鐘,之前的時間是-260秒。但是如果我增加這些值,比如_1_到_1110_,索引需要400秒。任何其他想法?由於我們很可能希望超過一年的最大時間跨度爲525600(以分鐘爲單位),所以這肯定會花費太長的時間。 – StefanOverFlow