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

Откуда: Киев
Сообщений: 597
Подскажите, как совершить такое (server 2000) :

исходные данные

a b dt
----------------------------
1 1 2006-09-09 01:13:21.000
2 2 2006-09-09 01:13:22.000
2 1 2006-09-09 01:13:23.000
3 3 2006-09-09 01:13:24.000
3 2 2006-09-09 01:13:26.000
4 4 2006-09-09 01:13:27.000
4 3 2006-09-09 01:13:28.000
5 5 2006-09-09 01:13:29.000
6 4 2006-09-09 01:13:30.000
6 6 2006-09-09 01:13:31.000

Хочу получить такое

1,1
1,1, 2,2
1,1, 2,2, 3,3
1,1, 2,2, 3,3, 4,4
5,5
1,1, 2,2, 3,3, 4,4, 6,6

Ну или так:

a b c
------
1,1,1
1,1,2
2,2,2
1,1,3
2,2,3
3,3,3
1,1,4
2,2,4
3,3,4
4,4,4
5,5,5
1,1,6
2,2,6
3,3,6
4,4,6
6,6,6

в принципе без разницы

Исходные данные в виде скриптов:
create table #temp (a int, b int, dt datetime)
insert into #temp values(1, 1, '2006-09-09 01:13:21.000')
insert into #temp values(2, 2, '2006-09-09 01:13:22.000')
insert into #temp values(2, 1, '2006-09-09 01:13:23.000')
insert into #temp values(3, 3, '2006-09-09 01:13:24.000')
insert into #temp values(3, 2, '2006-09-09 01:13:26.000')
insert into #temp values(4, 4, '2006-09-09 01:13:27.000')
insert into #temp values(4, 3, '2006-09-09 01:13:28.000')
insert into #temp values(5, 5, '2006-09-09 01:13:29.000')
insert into #temp values(6, 4, '2006-09-09 01:13:30.000')
insert into #temp values(6, 6, '2006-09-09 01:13:31.000')


Заранее спасибо :)
25 дек 09, 15:20    [8119455]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey Sribnyak
Хочу получить такое

1,1
1,1, 2,2
1,1, 2,2, 3,3
1,1, 2,2, 3,3, 4,4
5,5
1,1, 2,2, 3,3, 4,4, 6,6

А в этом результате есть какой-то алгоритмический смысл ?
25 дек 09, 16:17    [8119767]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 597
Смысл такой... если значение "b" уже встречалось на "a" меньше текущего, оно должно быть выведено с текущим "а"
25 дек 09, 16:29    [8119838]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Алексей2003
Member

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

для спящего время бодрствования равносильно сну
25 дек 09, 16:59    [8120051]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey Sribnyak
Смысл такой... если значение "b" уже встречалось на "a" меньше текущего, оно должно быть выведено с текущим "а"

И что задает порядок записей ?
25 дек 09, 17:01    [8120068]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 597
Glory,

с а=1 присутствует только одно значение, оно остается без изменений.
с a=2 есть два значения 2,1 и 2,2. b=2 встречается первый раз - оно неизменно... b=1 уже присутствовало в первой строке, поэтому вторая строка будет выглядеть как 1.1 2.2
c a=3 опять же существует два значения 3,3 и 3,2. b=3 уникально, его оставляем... b=2 встречалось с a=2 мы добавляем его, а так же предшествующее ему значение. тогда третья строка выходит такой 1,1,2,2,3,3
...c a=5 одно единственное значение оно уникально оставляем пятую строку без изменений.
с а=6 есть два значения b 4 и 6. значение b=4 встречалось на a=4 мы берем всю строку до этой (или все значения по цепочке) Как-то так...
25 дек 09, 17:40    [8120243]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Andrey Sribnyak
Glory,

с а=1 присутствует только одно значение,

Т.е. поле а задает порядок записей ?
25 дек 09, 17:43    [8120258]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 597
ДА
25 дек 09, 18:29    [8120423]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 597
Алексей2003,

итерационно это должно выглядеть так :-)

первая итерация...
1,1
1,1,2,2
2,2,3,3
3,3,4,4
5,5
4,4,6,6

после второй

1,1
1,1, 2,2
1,1, 2,2, 3,3
2,2, 3,3, 4,4
5,5
3,3, 4,4, 6,6

третей

1,1
1,1, 2,2
1,1, 2,2, 3,3
1,1, 2,2, 3,3, 4,4
5,5
2,2, 3,3 4,4, 6,6

четвертой

1,1
1,1, 2,2
1,1, 2,2, 3,3
1,1, 2,2, 3,3, 4,4
5,5
1,1, 2,2, 3,3, 4,4, 6,6
25 дек 09, 21:41    [8120931]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а почему для 3, 2 не добавляется строка 2, 1?

для спящего время бодрствования равносильно сну
26 дек 09, 11:50    [8121657]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
оп?
declare @t table(a int, b int, dt datetime)
insert into @t (a, b, dt)


select 1, 1, '20060909 01:13:21.000' union all
select 2, 2, '20060909 01:13:22.000' union all
select 2, 1, '20060909 01:13:23.000' union all
select 3, 3, '20060909 01:13:24.000' union all
select 3, 2, '20060909 01:13:26.000' union all
select 4, 4, '20060909 01:13:27.000' union all
select 4, 3, '20060909 01:13:28.000' union all
select 5, 5, '20060909 01:13:29.000' union all
select 6, 4, '20060909 01:13:30.000' union all
select 6, 6, '20060909 01:13:31.000'

select a, b, b from @t t1 where not exists(select * from @t t2 where t2.b = t1.b and t1.a > t2.a)
union all 
select t2.a, t2.b, t1.a aa
 from @t t1
  join @t t2
   on t1.b >= t2.b and not exists(select * from @t t22 where t22.b = t2.b and t2.a > t22.a)
 where exists(select * from @t t2 where t2.b = t1.b and t1.a > t2.a)
order by 3, 1

для спящего время бодрствования равносильно сну
26 дек 09, 12:53    [8121740]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Andrey Sribnyak
Member

Откуда: Киев
Сообщений: 597
Алексей2003,

Браво!

Огромное спасибо!
26 дек 09, 13:01    [8121753]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить