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

Откуда: р-О-ссия, Барвиха
Сообщений: 126
Опять приходится прибегнуть к помощи Коллективного Разума на форуме...

Есть таблица:
IDSeriyaNumKomplektNum
11201
21202
31203
41211
51212
61213
71214
81216
91217
101218
111221
121231
131241

При помощи какого запроса можно получить такой результат?
SerStartSerEndKomplStartKomplEnd
12012013
12112114
12112168
12212411

Я могу отсортировать по сериям и потом по комплектам. И в цикле перебрать все.
Но как построить красивый запрос?

Алгебра множеств страдает :(
17 ноя 11, 10:07    [11610610]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
temrus
Алгебра множеств страдает

Хромает прежде всего постановка задачи
"Получить результат" - так можно сказать про любую задачу
17 ноя 11, 10:10    [11610626]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
temrus
Member

Откуда: р-О-ссия, Барвиха
Сообщений: 126
Glory,

Есть таблица, хранящая серии и номера. В каждой серии могут быть разные номера комплектов.
Если серии идут друг за другом, а номера комплектов в них одни и те же,
то в результирующей таблице можно указать:
в поле SerStart - номер серии, с которой начинается период идентичных по комплектности серий.
SerEnd - номер серии, которой заканчивается период,
KomplStart - начальный номер комплекта,
KomplEnd - конечный номер комплекта.

Чуть по-проще результат можно описать следующим образом:
Серии с №120 по №120 имеет комплекты с 1 по 3
Серии с №121 по №121 имеет комплекты с 1 по 4
Серии с №121 по №121 имеет комплекты с 6 по 8
Серии с №122 по №124 имеет комплекты с 1 по 3

Вот теперь должно быть всем понятно :)
17 ноя 11, 10:23    [11610684]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
temrus,

и почему же 122,123,124 попали на одну строку?
17 ноя 11, 10:23    [11610687]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
temrus
Member

Откуда: р-О-ссия, Барвиха
Сообщений: 126
Сорри.
Корректировка:

Серии с №120 по №120 имеет комплекты с 1 по 3
Серии с №121 по №121 имеет комплекты с 1 по 4
Серии с №121 по №121 имеет комплекты с 6 по 8
Серии с №122 по №124 имеет комплекты с 1 по 1
17 ноя 11, 11:01    [11610980]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
Добрый Э - Эх
Guest
100500 раз обсуждалось.
два разнооконных row_number-а тебе в помощь...
17 ноя 11, 11:28    [11611225]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
temrus
Member

Откуда: р-О-ссия, Барвиха
Сообщений: 126
Добрый Э - Эх
100500 раз обсуждалось.
два разнооконных row_number-а тебе в помощь...

Ccылку не подскажете?
17 ноя 11, 11:33    [11611297]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Диапазон без дырок
17 ноя 11, 11:38    [11611340]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
Добрый Э - Эх
Guest
Паганель, там всего один ROW_NUMBER. :)
Вот тут два: тынц. Но там автор не я...
17 ноя 11, 11:43    [11611406]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
Добрый Э - Эх
Guest
А тут и два и автор я...
17 ноя 11, 11:46    [11611439]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
temrus
Member

Откуда: р-О-ссия, Барвиха
Сообщений: 126
Добрый Э - Эх,

Изучаю....
17 ноя 11, 12:01    [11611590]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
Добрый Э - Эх
Guest
В качетсве примера - первая часть свертки (свертка комплектов по серийникам):
-- 
-- Набор тестовых данных:
with
  b$m_test (Id, SeriyaNum, KomplektNum) as
    (
      select 1,120,1 union all
      select 2,120,2 union all
      select 3,120,3 union all
      select 4,121,1 union all
      select 5,121,2 union all
      select 6,121,3 union all
      select 7,121,4 union all
      select 8,121,6 union all
      select 9,121,7 union all
      select 10,121,8 union all
      select 11,122,1 union all
      select 12,123,1 union all
      select 13,124,1
    )
--
-- Основной запрос:
select SeriyaNum, MIN(KomplektNum) as KomplStart, MAX(KomplektNum) as KomplEnd
  from (
         select t.*,
                ROW_NUMBER() 
                      over(partition by SeriyaNum 
                               order by KomplektNum) -
                KomplektNum as grp_id
           from b$m_test t
        ) v
  group by SeriyaNum, grp_id
  order by SeriyaNum
17 ноя 11, 12:12    [11611718]     Ответить | Цитировать Сообщить модератору
 Re: Свертка периодов в таблице  [new]
Добрый Э - Эх
Guest
Полная свертка:
--
-- Тестовые данные:
with
  b$m_test (Id, SeriyaNum, KomplektNum) as
    (
      select 1,120,1 union all
      select 2,120,2 union all
      select 3,120,3 union all
      select 4,121,1 union all
      select 5,121,2 union all
      select 6,121,3 union all
      select 7,121,4 union all
      select 8,121,6 union all
      select 9,121,7 union all
      select 10,121,8 union all
      select 11,122,1 union all
      select 12,123,1 union all
      select 13,124,1
    )
--
-- Основной запрос:
select MIN(SeriyaNum) as SerStart, MAX(SeriyaNum) as SerEnd, KomplStart, KomplEnd
  from (
         select SeriyaNum, MIN(KomplektNum) as KomplStart, MAX(KomplektNum) as KomplEnd,
                case 
                  when COUNT(1) = 1 then ROW_NUMBER() over(order by SeriyaNum) - SeriyaNum
                end as grp_id,
                case when COUNT(1) != 1 then SeriyaNum end as flag
           from (
                  select t.*,
                         ROW_NUMBER() 
                               over(partition by SeriyaNum 
                                        order by KomplektNum) -
                         KomplektNum as grp_id
                    from b$m_test t
                 ) v
           group by SeriyaNum, grp_id
        ) v
  group by flag, grp_id, KomplStart, KomplEnd
  
17 ноя 11, 12:30    [11611928]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить