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

Откуда:
Сообщений: 5
Коллеги, добрый день.

Есть таблица a:
create table a(id int primary key identity, s int, d datetime)
go

insert into a(s,d)
values(1,getdate())
go

insert into a(s,d)
values(1,getdate())
go

insert into a(s,d)
values(1,getdate())
go

insert into a(s,d)
values(2,getdate())
go

insert into a(s,d)
values(2,getdate())
go

select * from a
go


1	1	2012-07-10 11:54:20.947
2	1	2012-07-10 11:54:20.957
3	1	2012-07-10 11:54:20.963
4	2	2012-07-10 11:54:20.973
5      2       2012-07-10 11:54:20.983


На выходе нужно получить разницу по колонке d в рамках одного значения s по возрастанию поля id.
Правильный ответ должен быть такой:

id  s    d
1   1    2012-07-10 11:54:20.957 - 2012-07-10 11:54:20.947
2   1    2012-07-10 11:54:20.963 - 2012-07-10 11:54:20.957
3   1    0 (в рамках одного s нет след. записей)
4   2    2012-07-10 11:54:20.983 - 2012-07-10 11:54:20.973
5   2    0


Можно подзапросом:

select *, d - (select top 1 d from a x where x.s = a.s and x.id > a.id order by id) from a


Но в рамках реальных масштабов работает слишком медленно.
Microsoft SQL Server 2008 (SP1)

Какие еще могут быть варианты? Спасибо!
10 июл 12, 13:09    [12844143]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: расстояние между датами у соседних записей  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
Сергей Киселев,

create nonclustered index ix_as on a(s) include (d)
?
10 июл 12, 13:27    [12844305]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: расстояние между датами у соседних записей  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1873
мне кажется, что курсор сработает быстрее
10 июл 12, 13:27    [12844317]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: расстояние между датами у соседних записей  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
  • пронумеровать в CTE ROW_NUMBERом, после чего сджойнить по номерам
  • CROSS APPLY вместо коррелированных подзапросов
  • 10 июл 12, 13:34    [12844386]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с запросом: расстояние между датами у соседних записей  [new]
    Сергей Киселев
    Member

    Откуда:
    Сообщений: 5
    Shakill, индекс есть, все равно работает медленно, объем данных большой.
    10 июл 12, 13:35    [12844398]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с запросом: расстояние между датами у соседних записей  [new]
    Сергей Киселев
    Member

    Откуда:
    Сообщений: 5
    iap, спасибо за предложенные варианты.

    Но оба дали практически тоже самое быстродействие :(
    10 июл 12, 13:51    [12844561]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с запросом: расстояние между датами у соседних записей  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47198
    Сергей Киселев
    iap, спасибо за предложенные варианты.

    Но оба дали практически тоже самое быстродействие :(
    А индексы-то есть? Какие?
    10 июл 12, 14:05    [12844688]     Ответить | Цитировать Сообщить модератору
     Re: Помогите с запросом: расстояние между датами у соседних записей  [new]
    Shakill
    Member

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

    Но оба дали практически тоже самое быстродействие :(


    как так? покажите запрос где вы джойнили по номерам
    и какие на самом деле индексы висят на таблице
    10 июл 12, 14:07    [12844703]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить