2017-02-06 5 views
0

Теперь я включаю в себя некоторый параллелизм с моим приложением ProcessXX, я не уверен, что данные могут быть в правильном порядке. Поэтому Im работает в запросе, чтобы вернуть нижний и верхний пределы, чтобы перейти к ProcessZZ.Как рассчитать промежутки между строками

Моя таблица avl_pool имеет avl_id и has_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 

Я могу поставить Everthing в Muliple КТР и вернуть оба результата, но я думаю, что это может быть ручка, как какой-нибудь остров , но не уверен, как это сделать.

Так запрос должен выглядеть

SELECT min_avl_id, min_avl_id 
FROM cte 


min_avl_id | min_avl_id 
23561211 | 23561219 
+0

Можете ли вы изменить свой вопрос и показать, какие результаты вы ищете? –

+0

В этом случае мне нужны два столбца со значениями '23561211, 23561219' –

ответ

1

Если я правильно понимаю, вы хотите присвоить порядковый номер каждого блок. Это число демаркируется значениями NULL в has_link.

Если это проблема, то накопленная сумма решает проблему:

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

Nevermind Я получил это сейчас. Наконец, я понимаю, как работает остров. Благодарю. –

+0

@JuanCarlosOropeza. , , Рад, что смог помочь. –