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

Откуда:
Сообщений: 15
MS SQL Server 2000.
Datec1c2c3
01.01.2014101
02.01.2014100
03.01.2014000
04.01.2014001
05.01.2014111


Нужно написать SELECT так, чтобы при выборе из полей c1, c2 исключить дублирование соседних строк запроса, т.е.
SELECT Date, c1, c2
FROM Таблица
WHERE Date BETWEEN '01.01.2014' AND '05.01.2014'
ORDER BY Date

Вернет
Datec1c2
01.01.201410
02.01.201410
03.01.201400
04.01.201400
05.01.201411


А нужно:
Datec1c2
01.01.201410
03.01.201400
05.01.201411


Спасибо!
1 фев 14, 07:39    [15503929]     Ответить | Цитировать Сообщить модератору
 Re: SELECT исключение соседних повторяющихся строк  [new]
o-o
Guest
Vinc,
словесное описание -- зашибись.
если надо все уникальные комбинации c1, c2,
и при этом любую дату, то вот так:
declare @t table (date char(10), c1 int, c2 int, c3 int);
insert into @t values
('01.01.2014',	1,	0,	1),
('02.01.2014',	1,	0,	0),
('03.01.2014',	0,	0,	0),
('04.01.2014',	0,	0,	1),
('05.01.2014',	1,	1,	1)

select min(date) as date, c1, c2
from @t
group by c1, c2
order by 1
---------------------
date	c1	c2
01.01.2014	1	0
03.01.2014	0	0
05.01.2014	1	1
1 фев 14, 10:25    [15504001]     Ответить | Цитировать Сообщить модератору
 Re: SELECT исключение соседних повторяющихся строк  [new]
o-o
Guest
ну и если дата действительно хранится строкой, то Ваш BETWEEN -- ни о чем:
declare @t table (date char(10), c1 int, c2 int, c3 int);
insert into @t values
('01.01.2014',	1,	0,	1),
('02.01.2014',	1,	0,	0),
('03.01.2014',	0,	0,	0),
('04.01.2014',	0,	0,	1),
('31.01.2014',	1,	1,	1)

select date
from @t
WHERE Date BETWEEN '01.01.2014' AND '05.02.2014'
------
01.01.2014
02.01.2014
03.01.2014
04.01.2014 
1 фев 14, 10:31    [15504008]     Ответить | Цитировать Сообщить модератору
 Re: SELECT исключение соседних повторяющихся строк  [new]
Vinc
Member

Откуда:
Сообщений: 15
Datec1c2c3
01.01.2014101
02.01.2014100
03.01.2014000
04.01.2014001
05.01.2014111


o-o, дату написал строкой для упрощения, хранится она в поле типа DateTime и легко выбирается запросом типа WHERE Date = 'YYYYMMDD H:NN:SS', здесь проблем нет и вопрос не в этом.
Мне не нужны только все уникальные комбинации, это-то просто, мне нужно отфильтровать именно соседние повторяющиеся строки. Т.е. если расширить нашу таблицу вот так

Datec1c2c3
01.01.2014101
02.01.2014100
03.01.2014000
04.01.2014001
05.01.2014111
06.01.2014101


Запрос должен вернуть вот это

Datec1c2
01.01.201410
03.01.201400
05.01.201411
06.01.201410
1 фев 14, 11:33    [15504069]     Ответить | Цитировать Сообщить модератору
 Re: SELECT исключение соседних повторяющихся строк  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
declare @t table (date datetime, c1 int, c2 int, c3 int);
insert into @t values
('20140101',	1,	0,	1);
insert into @t values
('20140102',	1,	0,	0);
insert into @t values
('20140103',	0,	0,	0);
insert into @t values
('20140104',	0,	0,	1);
insert into @t values
('20140105',	1,	1,	1);
insert into @t values
('20140106',	1,	0,	1);

select
 *
from
 @t t
where
 not exists(
  select
   *
  from
   (select top 1 * from @t where date < t.date order by date desc) x
  where
   x.c1 = t.c1 and x.c2 = t.c2
 );
1 фев 14, 12:31    [15504160]     Ответить | Цитировать Сообщить модератору
 Re: SELECT исключение соседних повторяющихся строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
WITH T AS
(
 SELECT * FROM
 (VALUES
  ('20140101',1,0,1)
 ,('20140102',1,0,0)
 ,('20140103',0,0,0)
 ,('20140104',0,0,1)
 ,('20140105',1,1,1)
 ,('20140106',1,0,1)
 )T(Date,c1,c2,c3)
)
SELECT T.*
FROM T
OUTER APPLY(SELECT TOP(1)* FROM T TT WHERE TT.Date<T.Date ORDER BY TT.Date DESC) TT
WHERE TT.Date IS NULL OR (TT.c1<>T.c1 OR TT.c2<>T.c2);
И ещё 100500 вариантов, причём в зависимости от версии сервера
1 фев 14, 13:05    [15504224]     Ответить | Цитировать Сообщить модератору
 Re: SELECT исключение соседних повторяющихся строк  [new]
Vinc
Member

Откуда:
Сообщений: 15
Спасибо всем ответившим.
В MS SQL Server 2000 работает вариант от invm, спасибо, это - именно то, что нужно.
1 фев 14, 14:32    [15504389]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить