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

Откуда:
Сообщений: 84
Есть таблица с данными.
DateTypeindex
2011-06-07 10:13:41.0001a
2011-06-07 10:12:49.0001s
2011-06-07 10:12:32.0001d
2011-06-07 10:11:59.0000f
2011-06-07 10:12:14.0000g
2011-06-07 10:12:13.0001h
2011-06-07 10:09:01.0001j
2011-06-07 10:08:57.0001k
2011-06-07 10:08:53.0001l
2011-06-07 10:08:51.0001z
2011-06-07 10:08:46.0000x
2011-06-07 10:08:44.0001c
2011-06-07 10:06:56.0000v

Необходимо выбрать с таблицы только те данные у которых Type = 0 и два значения до и после 0.
Как это можно сделать пока не знаю. :-(
Все данные отсортированы по дате.

Желаемый результат должен быть таким.
DateTypeindex
2011-06-07 10:12:49.0001s
2011-06-07 10:12:32.0001d
2011-06-07 10:11:59.0000f
2011-06-07 10:12:14.0000g
2011-06-07 10:12:13.0001h
2011-06-07 10:09:01.0001j
2011-06-07 10:08:53.0001l
2011-06-07 10:08:51.0001z
2011-06-07 10:08:46.0000x
2011-06-07 10:08:44.0001c
2011-06-07 10:06:56.0000v

VER.: Microsoft SQL Server 2000 - 8.00.760 (Intel X86)
16 июн 11, 16:11    [10823021]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Валдай
Member

Откуда:
Сообщений: 113
Коля77,

сдается тестовые данные не отсортированы

вот эта строка не на своем месте

автор
2011-06-07 10:11:59.000 0 f
16 июн 11, 16:40    [10823281]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Валдай
Member

Откуда:
Сообщений: 113
declare @t table ([date] datetime, [type] bit, [index] char(1))
insert @t
values 
('2011-06-07 10:13:41.000',	1,	'a'),
('2011-06-07 10:12:49.000',	1,	's'),
('2011-06-07 10:12:32.000',	1,	'd'),
('2011-06-07 10:12:29.000',	0,	'f'),
('2011-06-07 10:12:14.000',	0,	'g'),
('2011-06-07 10:12:13.000',	1,	'h'),
('2011-06-07 10:09:01.000',	1,	'j'),
('2011-06-07 10:08:57.000',	1,	'k'),
('2011-06-07 10:08:53.000',	1,	'l'),
('2011-06-07 10:08:51.000',	1,	'z'),
('2011-06-07 10:08:46.000',	0,	'x'),
('2011-06-07 10:08:44.000',	1,	'c'),
('2011-06-07 10:06:56.000',	0,	'v')



  select *
  from @t t
  where t.[type]=0

  union 

  select z.*
  from @t t
  cross apply(select top 2 * from @t where [date]<t.[date] order by [date] desc)z
  where t.[type]=0

  union 

  select z.*
  from @t t
  cross apply(select top 2 * from @t where [date]>t.[date] order by [date])z
  where t.[type]=0

  order by 1 desc
16 июн 11, 16:46    [10823342]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Коля77
Member

Откуда:
Сообщений: 84
Да с сортировкой я немного ошибся.
Приведенные вами вариант на sql2000 не работает.
16 июн 11, 16:58    [10823435]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Коля77
Приведенные вами вариант на sql2000 не работает


Потому что там нету табличных конструкторов. Т.е. вот этот абзац
insert @t
values 
('2011-06-07 10:13:41.000',	1,	'a'),
('2011-06-07 10:12:49.000',	1,	's'),
('2011-06-07 10:12:32.000',	1,	'd'),
('2011-06-07 10:12:29.000',	0,	'f'),
('2011-06-07 10:12:14.000',	0,	'g'),
('2011-06-07 10:12:13.000',	1,	'h'),
('2011-06-07 10:09:01.000',	1,	'j'),
('2011-06-07 10:08:57.000',	1,	'k'),
('2011-06-07 10:08:53.000',	1,	'l'),
('2011-06-07 10:08:51.000',	1,	'z'),
('2011-06-07 10:08:46.000',	0,	'x'),
('2011-06-07 10:08:44.000',	1,	'c'),
('2011-06-07 10:06:56.000',	0,	'v')
раздербаньте построчно и вставляйте каждую строку персонально.
16 июн 11, 17:11    [10823539]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
ё
Guest
declare @t table (id int identity, Date datetime, Type int, [index] char(1))

insert into @t
 
select '2011-06-07 10:13:41.000', 1, 'a' union all 
select '2011-06-07 10:12:49.000', 1, 's' union all 
select '2011-06-07 10:12:32.000', 1, 'd' union all 
select '2011-06-07 10:11:59.000', 0, 'f' union all 
select '2011-06-07 10:12:14.000', 0, 'g' union all 
select '2011-06-07 10:12:13.000', 1, 'h' union all 
select '2011-06-07 10:09:01.000', 1, 'j' union all 
select '2011-06-07 10:08:57.000', 1, 'k' union all 
select '2011-06-07 10:08:53.000', 1, 'l' union all 
select '2011-06-07 10:08:51.000', 1, 'z' union all 
select '2011-06-07 10:08:46.000', 0, 'x' union all 
select '2011-06-07 10:08:44.000', 1, 'c' union all 
select '2011-06-07 10:06:56.000', 0, 'v'
order by 1

select * from @t

select * from @t 
where id in
	(select a.id+b.dig from 
	(select id from @t where Type=0) a
	cross join
	(select -2 as dig union all select -1 union all select 0 union all select 1 union all select 2) b)

(13 row(s) affected)

id          Date                                                   Type        index 
----------- ------------------------------------------------------ ----------- ----- 
1           2011-06-07 10:06:56.000                                0           v
2           2011-06-07 10:08:44.000                                1           c
3           2011-06-07 10:08:46.000                                0           x
4           2011-06-07 10:08:51.000                                1           z
5           2011-06-07 10:08:53.000                                1           l
6           2011-06-07 10:08:57.000                                1           k
7           2011-06-07 10:09:01.000                                1           j
8           2011-06-07 10:11:59.000                                0           f
9           2011-06-07 10:12:13.000                                1           h
10          2011-06-07 10:12:14.000                                0           g
11          2011-06-07 10:12:32.000                                1           d
12          2011-06-07 10:12:49.000                                1           s
13          2011-06-07 10:13:41.000                                1           a

(13 row(s) affected)

id          Date                                                   Type        index 
----------- ------------------------------------------------------ ----------- ----- 
1           2011-06-07 10:06:56.000                                0           v
2           2011-06-07 10:08:44.000                                1           c
3           2011-06-07 10:08:46.000                                0           x
4           2011-06-07 10:08:51.000                                1           z
5           2011-06-07 10:08:53.000                                1           l
6           2011-06-07 10:08:57.000                                1           k
7           2011-06-07 10:09:01.000                                1           j
8           2011-06-07 10:11:59.000                                0           f
9           2011-06-07 10:12:13.000                                1           h
10          2011-06-07 10:12:14.000                                0           g
11          2011-06-07 10:12:32.000                                1           d
12          2011-06-07 10:12:49.000                                1           s

(12 row(s) affected)

16 июн 11, 17:14    [10823560]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
SamMan
Потому что там нету табличных конструкторов. Т.е. вот этот абзац
cross apply там тоже нету.
16 июн 11, 17:14    [10823565]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
ё
Guest
SamMan
Коля77
Приведенные вами вариант на sql2000 не работает


Потому что там нету табличных конструкторов.

cross apply - тоже нет... (
16 июн 11, 17:15    [10823573]     Ответить | Цитировать Сообщить модератору
 Re: Выборка данных  [new]
Коля77
Member

Откуда:
Сообщений: 84
Спасибо!
16 июн 11, 17:25    [10823648]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить