2017-02-06 28 views
0

現在我包含一些與我的應用程序並行,我不確定數據可以按正確的順序處理。所以我在查詢中返回下限和上限傳遞到ProcessZZ我如何計算行之間的差距

我的表avl_pool有avl_idhas_link和其他一些領域和穩定的數據流,當新的數據到達他們開始與has_link=null,當ProcessX光潔度has_link有鏈接值xxxx行是一些數字。

現在下一步我只能處理那些帶有鏈接的行,但我不能跳過行,因爲順序非常重要。

在這種情況下,我需要ProcessZZ(23561211, 23561219)

rn | avl_id | has_link 
1 | 23561211 | xxxx  -- start 
2 | 23561212 | xxxx 
3 | 23561213 | xxxx 
4 | 23561214 | xxxx 
5 | 23561215 | xxxx 
6 | 23561216 | xxxx 
7 | 23561217 | xxxx 
8 | 23561218 | xxxx 
9 | 23561219 | xxxx  -- end 
10 | 23561220 | null 
11 | 23561221 | xxxx 
12 | 23561222 | xxxx 
13 | 23561223 | xxxx 

目前我有:

-- starting avl_id need to be send to ProcessZZ 
SELECT MIN(avl_id) as min_avl_id 
FROM avl_db.avl_pool 
WHERE NOT has_link IS NULL 

-- first avl_id still on hands of ProcessXX (but can be null) 
SELECT MIN(avl_id) as max_avl_id -- here need add a LAG 
FROM avl_db.avl_pool 
WHERE has_link IS NULL 
    AND avl_id > (SELECT MIN(avl_id) 
       FROM avl_db.avl_pool 
       WHERE NOT has_link IS NULL) 

-- In case everyone has_link already the upper limit is the last one on the table. 
SELECT MAX(avl_id) as max_avl_id 
FROM avl_db.avl_pool 

我可以把寄託都在muliple CTE和返回兩個結果,但我認爲這是可以處理像一些島嶼,但不知道如何。

所以查詢應該看起來像

SELECT min_avl_id, min_avl_id 
FROM cte 


min_avl_id | min_avl_id 
23561211 | 23561219 
+0

你可以編輯你的問題,並顯示你正在尋找什麼結果? –

+0

在這種情況下,我需要兩列值爲23561211,23361219' –

回答

1

如果我理解正確的,你想一個序列號分配給每個塊。該數字由has_link中的NULL值劃定。

如果是這樣的問題,那麼累加和解決了這個問題:

select p.*, 
     sum(case when has_link is null then 1 else 0 end) over (order by rn) as grp 
from avl_db.avl_pool p; 

這實際上包括在輸出中NULL值。最簡單的方法可能是子查詢:

select p.* 
from (select p.*, 
      sum(case when has_link is null then 1 else 0 end) over (order by rn) as grp 
     from avl_db.avl_pool p 
    ) p 
where has_link is not null; 
+0

是的,這看起來是正確的。但我不知道你爲什麼說包括null ?.第一個查詢似乎沒問題。因爲我只對第一組感興趣。 https://i.stack.imgur.com/lNV6B.png –

+1

沒關係我現在得到了這個。最後,我明白島上的工作方式。謝謝。 –

+0

@JuanCarlosOropeza。 。 。很高興我能幫上忙。 –