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

Откуда:
Сообщений: 638
Всем доброго дня!
Есть безобидный запрос:
SELECT [rn] -- (номер записи)
      ,[ID]
      ,[PACKAGE_INSTANCE_ID]
      ,[DATE_START]
  FROM [BGAN_LIVE_COPY].[dbo].[vTERM_INST_DATE_START]
Необходимо прилепить в конец еще одно поле DATE_END, в которое бы попадало значение DATE_START следующей записи. Как это можно красиво сделать одним запросом, подскажите, ПЛЗ!!! Заранее благодарен!
Пробовал через функцию:

dbo.fn_def_DATE_END(rn) AS DATE_END

вот текст функции:

ALTER FUNCTION [dbo].[fn_def_DATE_END]
(@rn INT)
RETURNS DATETIME
AS
BEGIN
    DECLARE @DATE_END DATETIME
    SELECT @DATE_END=DATE_START FROM vTERM_INST_DATE_START WHERE rn=(@rn+1)
    RETURN @DATE_END
END
Все работает, но ужас как медленно. Вот и прошу помощи у местных гуру.
5 июл 11, 15:36    [10925725]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
left join по rn = rn+1 ?
5 июл 11, 15:40    [10925769]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
Bobby
Member

Откуда:
Сообщений: 638
Зайцев Фёдор,

А что джоинить, саму себя?
5 июл 11, 16:03    [10926081]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
baracs
Member

Откуда: Москва
Сообщений: 7217
Bobby
Зайцев Фёдор,

А что джоинить, саму себя?
Почему нет?
5 июл 11, 16:05    [10926118]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
AlexeyVD
Member

Откуда:
Сообщений: 473
можете попробовать сделать что-то вроде этого (могу немного в синтаксисе напутать):

select t1.id,
         t1.dt,
         t2.dt_end
from table1 t1
cross apply (select top 1 dt as dt_end from table1 where id > t1.id) t2
5 июл 11, 16:07    [10926141]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
USBcab
Member

Откуда:
Сообщений: 48
Bobby,
SELECT [rn] -- (номер записи)
,a.[ID]
,a.[PACKAGE_INSTANCE_ID]
,a.[DATE_START]
,b..[DATE_START] AS DATE_END
FROM [BGAN_LIVE_COPY].[dbo].[vTERM_INST_DATE_START] a
inner join [BGAN_LIVE_COPY].[dbo].[vTERM_INST_DATE_START] b on b.[rn]=a.[rn]

Вроде так.
5 июл 11, 16:09    [10926161]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
USBcab
Member

Откуда:
Сообщений: 48
USBcab
Bobby,
SELECT [rn] -- (номер записи)
,a.[ID]
,a.[PACKAGE_INSTANCE_ID]
,a.[DATE_START]
,b..[DATE_START] AS DATE_END
FROM [BGAN_LIVE_COPY].[dbo].[vTERM_INST_DATE_START] a
inner join [BGAN_LIVE_COPY].[dbo].[vTERM_INST_DATE_START] b on b.[rn]=a.[rn]

Вроде так.


a.[rn]+1, конечно.
5 июл 11, 16:10    [10926173]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
AlexeyVD
можете попробовать сделать что-то вроде этого (могу немного в синтаксисе напутать):

select t1.id,
         t1.dt,
         t2.dt_end
from table1 t1
cross apply (select top 1 dt as dt_end from table1 where id > t1.id) t2

1) не cross apply, а outer apply
2) не top 1, а top (1)
3) в подзапросе с top должна быть сортировка
4) этот способ не лучше, чем функция
5 июл 11, 16:19    [10926263]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Зайцев Фёдор
4) этот способ не лучше, чем функция
Не лучше, чем инлайновая функция. И гораздо лучше, чем не инлайновая.
5 июл 11, 16:24    [10926309]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Гавриленко Сергей Алексеевич
инлайновая функция

это кто такое?
5 июл 11, 16:28    [10926353]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
yado4eg
Member

Откуда:
Сообщений: 202
[url=насчет скорости не знаю]http://technet.microsoft.com/ru-ru/library/ms189575%28v=SQL.90%29.aspx[/url]
5 июл 11, 16:28    [10926358]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
Bobby
Member

Откуда:
Сообщений: 638
ВСЕМ СПАСИБО!!!!
SELECT     
v1.rn,
v1.ID, 
v1.PACKAGE_INSTANCE_ID,
v1.DATE_START
,v2.DATE_START AS DATE_END
FROM         dbo.vTERM_INST_DATE_START v1
LEFT JOIN dbo.vTERM_INST_DATE_START v2
ON v1.rn+1=v2.rn

и все заколосилось
5 июл 11, 16:30    [10926379]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Зайцев Фёдор
Гавриленко Сергей Алексеевич
инлайновая функция

это кто такое?
BOL -> Inline Table-Valued Functions
5 июл 11, 16:35    [10926426]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
а я уж подумал, что речь идёт о скалярных ))
5 июл 11, 17:13    [10926766]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить