Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбор краевых значений с условием по группированию  [new]
lobanovv
Member

Откуда:
Сообщений: 3
Добрый день.
Есть хранимая процедура, которая возвращает набор данных:

1. Номер строки (1 - по NNN)
2. Инвентаризационный номер (int, может варьироваться)
3...10 Полю, по которым определяются попадает в выборку строка или нет.

по результатам выборки во временную таблицу попадают данные с номерами строк и инвентаризационным номером.
Например:
Номер строки; инвентаризационный номер
1;10100
2;10100
3;10100
4;10100
5;10100
8;10100
9;10100
10;10100
13;10100
14;12900
15;12900
16;12900
18;12900

Каким-то образом требуется агрегировать эти данные до одной строки по следующим параметрам:
Инвентаризационный номер
и последовательные номера строк - т.е. получить все диапазоны последовательных срок для каждого инвентаризационного номера.

То есть для примера:
10100;1;5
10100;8;10
10100;13;13
12900;14;16
12900;18;18

Подскажите, пожалуйста, в какую сторону копать.
29 апр 16, 13:28    [19121673]     Ответить | Цитировать Сообщить модератору
 Re: Выбор краевых значений с условием по группированию  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20600
Если делать влоб: вот так отбираются начала диапазонов
select t1.*
from table t1
left join table t2 on t1.num=t2.num and t1.imun=t2.inum+1
where t2.inum is null

Аналогично отбираются их концы. Осталось собрать воедино. Для соответствующих друг другу записей end.num-start.num минимален и неотрицателен.

Но лучше воспользоваться оконными функциями. Буде версия сервера позволяет.
29 апр 16, 13:36    [19121731]     Ответить | Цитировать Сообщить модератору
 Re: Выбор краевых значений с условием по группированию  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @t TABLE (id INT, val INT)
INSERT INTO @t
VALUES
    (1, 10100),
    (2, 10100),
    (3, 10100),
    (4, 10100),
    (5, 10100),
    (8, 10100),
    (9, 10100),
    (10, 10100),
    (13, 10100),
    (14, 12900),
    (15, 12900),
    (16, 12900),
    (18, 12900)

SELECT MAX(t.val), MIN(t.id), MAX(t.id)
FROM (
    SELECT *, rn = id - ROW_NUMBER() OVER (PARTITION BY val ORDER BY id)
    FROM @t
) t
GROUP BY t.rn
29 апр 16, 13:39    [19121743]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить