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

Откуда:
Сообщений: 109
Исходные данные
Поле_Id Поле1
1 4
2 4
3 5
4 3
5 3
6 3
7 3
8 4
9 4
10 4


Нужен вот такой результат
Поле_Id Поле1
2 4
3 5
6 3
10 4


т.е. из каждой возникающей последовательности однородности Поля1 нужно оставить только одну запись с ее значением и максимумом ключевого поля.
( Обратите внимание, что Поле1 = 4 в результате примера возникает дважды )
Длина последовательностей неизвестна.

Подскажите пжл способ реализовать это средствами СКЛ без перебора в цикле.
Спасибо.
25 май 09, 07:01    [7220863]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
namenike
т.е. из каждой возникающей последовательности однородности Поля1


Избитый вопрос, каким образом определяется предыдущая и последующая записи?
Визуально из Вашего примера - понятно.
Но практически... ведь нет.
25 май 09, 07:14    [7220872]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
тогда почему, не

2 4
3 5
7 3
10 4
25 май 09, 07:16    [7220874]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
А.. или полю "Поле_Id" порядок определяется? :)
25 май 09, 07:16    [7220875]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Добрый Э - Эх
Guest
group by по разности двух разнооконных row_number-ов
25 май 09, 07:22    [7220878]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Добрый Э - Эх
Guest
;with
--
-- Набор тестовых данных:
  t ([Поле_Id],[Поле1]) as 
    (
      select  1, 4 union all
      select  2, 4 union all
      select  3, 5 union all
      select  4, 3 union all
      select  5, 3 union all
      select  6, 3 union all
      select  7, 3 union all
      select  8, 4 union all
      select  9, 4 union all
      select 10, 4
    )
--
-- Основной запрос:
select max([Поле_Id]) as [max_Поле_Id],
       [Поле1]
  from (
         select t.*, row_number() over(order by [Поле_Id]) - 
                row_number() over(partition by [Поле1] order by [Поле_Id]) as grp_id
           from t
       ) as v
 group by [Поле1], grp_id 
 order by max([Поле_Id]);
max_Поле_IdПоле1
24
35
73
104
25 май 09, 07:28    [7220881]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
namenike
Member

Откуда:
Сообщений: 109
Добрый Э - Эх,
!!! СПАСИБО !!! :)
25 май 09, 08:36    [7220953]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Вот еще :)

create table #T (Id int, Field1 int) -- поля переименовала

--
insert into #T (Id, Field1)
select 1, 4
union all
select 2, 4
union all
select 3, 5
union all
select 4, 3
union all
select 5, 3
union all
select 6, 3
union all
select 7, 3
union all
select 8, 4
union all
select 9, 4
union all
select 10, 4

--основной запрос
SELECT t.Id, t.Field1       
FROM #T t
LEFT JOIN #T t1 ON t1.Id = t.Id+1
WHERE t.Field1 != isnull(t1.Field1, t.Field1+1)
ORDER BY t.Id

Вроде правильно работает:)
25 май 09, 09:00    [7221018]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Добрый Э - Эх
Guest
Кудряшка, автор топика ничего не говорил о непрерывности значений в поле Поле_Id.
Попробуй свой вариант на таком наборе данных:
insert into #T (Id, Field1)
select 0, 4
union all
select 2, 4
union all
select 3, 5
union all
select 4, 3
union all
select 5, 3
union all
select 7, 3
union all
select 9, 3
union all
select 11, 4
union all
select 13, 4
union all
select 15, 4
25 май 09, 09:07    [7221040]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Добрый Э - Эх,

Я ужо попробовала!
Ниработает.
Т.е. работает, но разносит в разные группы! :)
25 май 09, 09:09    [7221042]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
Кудряшка
Вот еще :)

create table #T (Id int, Field1 int) -- поля переименовала

--
insert into #T (Id, Field1)
select 1, 4
union all
select 2, 4
union all
select 3, 5
union all
select 4, 3
union all
select 5, 3
union all
select 6, 3
union all
select 7, 3
union all
select 8, 4
union all
select 9, 4
union all
select 10, 4

--основной запрос
SELECT t.Id, t.Field1       
FROM #T t
LEFT JOIN #T t1 ON t1.Id = t.Id+1
WHERE t.Field1 != isnull(t1.Field1, t.Field1+1)
ORDER BY t.Id

Вроде правильно работает:)

вроде так
SELECT *     
FROM #T t
outer apply (select top 1 t1.Id, t1.Field1 FROM #T t1 WHERE  t1.Id > t.Id ORDER BY Id) t1
where ISNULL(t1.Field1,t.Field1+1)!=t.Field1 
ORDER BY t.Id
25 май 09, 09:14    [7221063]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
ветерочек,

так работает:)
25 май 09, 09:23    [7221087]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
namenike
Member

Откуда:
Сообщений: 109
Коллеги, спасибо за проявленный интерес к теме.

Можно уточняющий вопрос:
Верно ли будет оперировать целым числом 1, если
Поле_Id будет datetime:
- ранжировным,
- со случайным приростом значения в кажд. след. строчке?
25 май 09, 10:47    [7221497]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
namenike
Коллеги, спасибо за проявленный интерес к теме.

Можно уточняющий вопрос:
Верно ли будет оперировать целым числом 1, если
Поле_Id будет datetime:
- ранжировным,
- со случайным приростом значения в кажд. след. строчке?

да
25 май 09, 10:52    [7221534]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Добрый Э - Эх
Guest
namenike
Коллеги, спасибо за проявленный интерес к теме.

Можно уточняющий вопрос:
Верно ли будет оперировать целым числом 1, если
Поле_Id будет datetime:
- ранжировным,
- со случайным приростом значения в кажд. след. строчке?
Пользуй мой вариант, если версия сервера позволяет. Он совершенно точно будет работать при всех твоих уточняющих обстоятельствах.
25 май 09, 10:52    [7221536]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
namenike
Member

Откуда:
Сообщений: 109
Еще раз спасибо!!!
25 май 09, 16:58    [7224317]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Reha
Member

Откуда:
Сообщений: 27
а как сделать то же самое, но в DataBase?
Nskv plast gruppa mef
10001 1 9 -
10001 2 4 2,80
10001 3 9 -
10001 5 9 -
10001 6 2 1,60
10001 7 2 3,00
10001 9 9 -
10001 10 9 -
10001 11 9 -
10001 14 9 -
10001 17 9 -
10001 22 1 5,80
10001 23 9 -
10001a 1 9 -
10001a 2 1 0,90
10001a 2 1 1,40
10001a 2 1 1,40
10001a 3 9 -
10001a 5 2 0,60
10001a 5 4 1,20
10001a 6 1 0,80
10001a 6 4 0,40
10001a 7 4 1,00
10001a 7 2 0,80
10001a 9 9 -
10001a 11 9 -
10001a 14 4 1,40
10001a 14 1 1,40
10001a 17 1 5,60
10001a 22 1 5,40

Как сделать из таблицы 1 таблицу 2
Nskv plast gruppa
10001 1 9
10001 2 4
10001 3 9
10001 5 9
10001 6 2
10001 7 2
10001 9 9
10001 10 9
10001 11 9
10001 14 9
10001 17 9
10001 22 1
10001 23 9
10001a 1 9
10001a 2 1
10001a 3 9
10001a 5 4
10001a 6 1
25 май 09, 22:13    [7225594]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Reha,

Я подозреваю, что так же, только свои поля и таблицу в предложеные запросы подставить. А вообще, вы такое запостили, что непонятно, какие значения в каких полях и что надо.
26 май 09, 08:21    [7226119]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
namenike
Member

Откуда:
Сообщений: 109
такое
ветерочек

SELECT *     
FROM #T t
outer apply (select top 1 t1.Id, t1.Field1 FROM #T t1 WHERE  t1.Id > t.Id ORDER BY Id) t1
where ISNULL(t1.Field1,t.Field1+1)!=t.Field1 
ORDER BY t.Id

или такое
такое
Добрый Э - Эх
select max([Поле_Id]) as [max_Поле_Id],
       [Поле1]
  from (
         select t.*, row_number() over(order by [Поле_Id]) - 
                row_number() over(partition by [Поле1] order by [Поле_Id]) as grp_id
           from t
       ) as v
 group by [Поле1], grp_id 
 order by max([Поле_Id]);


как преобразовать к случаю, когда Полей_N несколько
т.е.
ПолеId Поле1 Поле2 Поле3
1 4 3 2 1
2 4 3 2 1
3 5 6 3 5
4 3 2 2 4
5 3 2 2 4
6 3 2 2 4
7 3 2 2 4
8 4 3 2 1
9 4 3 2 1
10 4 3 2 1
27 май 09, 00:44    [7231842]     Ответить | Цитировать Сообщить модератору
 Re: Нетривиальный DISTINCT  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
И то и то будет работать.

Люди, сделайте пож скрипт создания таблицы и заполнения ее тестовыми данными + четко, что надо.
Имейте совесть
27 май 09, 09:47    [7232309]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить