У меня очень простая таблица с тремя столбцами и следующими данными:

+------+---------+---------+
| Cod  |  Value  |  status |
+------+---------+---------+
| 1    |  1      |  1      |
| 1    |  2      |  1      |
| 1    |  3      |  1      |
| 1    |  4      |  0      |
| 1    |  5      |  0      |
| 1    |  6      |  1      |
| 1    |  7      |  1      |
+------+---------+---------+

Мне нужно получить интервалы последовательных чисел каждого кода. Результат, который я ищу:

+------+----------------+----------------+---------+
| cod  |  min_val_intv  |  max_val_intv  |  status |
+------+----------------+----------------+---------+
| 1    |  4             |  5             |  0      |
| 1    |  1             |  3             |  1      |
| 1    |  6             |  7             |  1      |
+------+----------------+----------------+---------+

Моя проблема не в том, чтобы получить такой результат. Я пробовал использовать функцию min, max и группировать по:

SELECT cod, MIN(Value) AS min_val_intv, MAX(Value) AS max_val_intv, status
FROM test_table
GROUP BY status, cod

Кто-то мог бы мне помочь.

С уважением.

2
user3382813 5 Мар 2014 в 13:34

2 ответа

Лучший ответ

Попробуйте этот запрос:

with tab1 as
(select table1.*,
 ROW_NUMBER() OVER(ORDER BY (SELECT 1)) -
 ROW_NUMBER() OVER(PARTITION BY status order by Cod) rn1,
 ROW_NUMBER() OVER(ORDER BY (SELECT 1)) -
 ROW_NUMBER() OVER(order by value) rn2
from table1)
select cod,min(value) min_val,max(value) max_val,status 
from tab1
group by cod,status,rn1,rn2;

SQL Fiddle

3
Hamidreza 8 Мар 2014 в 05:03

С хорошими рекомендациями Hamidreza я почти достиг цели, я поставил запрос, чтобы иметь возможность просмотреть:

SQL Fiddle

Запрос:

with tab1 as 

(выберите table1. *, ROW_NUMBER () OVER (ORDER BY Cod) - ROW_NUMBER () OVER (PARTITION BY status order by cod, value) rn из table1)

Выберите cod, min (значение) min_val, max (значение) max_val, статус из группы tab1 по cod, status, rn;

Результат почти идеальный, но поскольку я переместил записи, если изменение положения, как в следующей ссылке SQL Fiddle . Результат не совсем правильный.

Кто-то придумывает, как это решить?

С уважением.

0
user3382813 6 Мар 2014 в 13:04