Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Vinc Member Откуда: Сообщений: 15 |
MS SQL Server 2000.
Нужно написать SELECT так, чтобы при выборе из полей c1, c2 исключить дублирование соседних строк запроса, т.е. SELECT Date, c1, c2 FROM Таблица WHERE Date BETWEEN '01.01.2014' AND '05.01.2014' ORDER BY Date Вернет
А нужно:
Спасибо! |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 фев 14, 07:39 [15503929] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Vinc Member Откуда: Сообщений: 15 |
o-o, дату написал строкой для упрощения, хранится она в поле типа DateTime и легко выбирается запросом типа WHERE Date = 'YYYYMMDD H:NN:SS', здесь проблем нет и вопрос не в этом. Мне не нужны только все уникальные комбинации, это-то просто, мне нужно отфильтровать именно соседние повторяющиеся строки. Т.е. если расширить нашу таблицу вот так
Запрос должен вернуть вот это
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 фев 14, 11:33 [15504069] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Vinc Member Откуда: Сообщений: 15 |
Спасибо всем ответившим. В MS SQL Server 2000 работает вариант от invm, спасибо, это - именно то, что нужно. |
1 фев 14, 14:32 [15504389] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |