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

Откуда: Челябинск
Сообщений: 173
Есть следующие данные в таблице
ID GROUP
1 A
2 A
3 A
4 Б
5 Б
6 А
7 А
8 С
9 Б
10 Б
Результат запроса должен быть следующий:
1 А
4 Б
6 А
8 С
9 Б
Тоесть необходимо определить начало каждой группы (начало определяется по минимальному ID).
4 июн 15, 15:01    [17730799]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20585
ID непрерывен? или имеются "дырки"?
4 июн 15, 15:12    [17730897]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Андрей Ч.
Member

Откуда: Челябинск
Сообщений: 173
Akina, могут быть дырки. С курсором и временной таблицей идея есть, но хотелось бы в одном запросе получить результат.
4 июн 15, 15:14    [17730906]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Добрый Э - Эх
Guest
Андрей Ч.,

разность двух разнооконных row_number-ов.
ну или поиск по форуму тем с моим участием по словам GRP_ID

на версии сервера 2012 и выше - LEAD/LAG
4 июн 15, 15:15    [17730910]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
WITH T AS(SELECT* FROM
(VALUES
 (1, 'A')
,(2, 'A')
,(3, 'A')
,(4, 'Б')
,(5,  'Б')
,(6, 'А')
,(7, 'А')
,(8, 'С')
,(9, 'Б')
,(10,'Б')
)X(ID,[GROUP]))
,R AS
(
 SELECT N=ROW_NUMBER()OVER(ORDER BY ID)-ROW_NUMBER()OVER(PARTITION BY [GROUP] ORDER BY ID),*
 FROM T
)
SELECT ID=MIN(ID),[GROUP]=MIN([GROUP])
FROM R
GROUP BY [GROUP],N
ORDER BY ID;
4 июн 15, 15:17    [17730924]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Андрей Ч.
Member

Откуда: Челябинск
Сообщений: 173
iap, спасибо огромное.
4 июн 15, 15:20    [17730945]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Андрей Ч.
iap, спасибо огромное.
Чё-то я подумал, а [GROUP]-то можно и без MIN() писать,
раз оно в GROUP BY
4 июн 15, 15:22    [17730954]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Добрый Э - Эх
Guest
iap,

ну, раз вариант на разности row_number-ов показал, на всякий случай покажу вариант на LAG-е:
--
-- Тестовыек данные:
WITH
  T AS
    (
      SELECT *
        FROM (
               VALUES (1, 'A')
                    , (2, 'A')
                    , (3, 'A')
                    , (4, 'B')
                    , (5, 'B')
                    , (6, 'A')
                    , (7, 'A')
                    , (8, 'C')
                    , (9, 'B')
                    , (10,'B')
             )X(ID,[GROUP])
    )
--
-- Основной запрос:
select top 1 with ties *
  from t
  order by case when lag([GROUP]) over(order by ID) = [GROUP] then 1 else 0 end
on-line проверка на sqlfiddle.com
4 июн 15, 15:47    [17731092]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Андрей Ч.
Member

Откуда: Челябинск
Сообщений: 173
Добрый Э - Эх, и вам тоже спасибо.
5 июн 15, 08:55    [17733654]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить