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

Откуда:
Сообщений: 882
Здравствуйте.
Не могу нормально сделать запрос, чтобы тот выполнялся быстрее ((

Есть таблица results:
PrjCode LineId upd U_PlanWC U_EndDate
1736_00 1 2017-01-26 0 31.12.2017
1736_00 1 2017-01-26 850 31.12.2017
1736_00 2 2018-01-25 1200 31.12.2018
1736_00 2 2018-10-25 1800 31.12.2018
1736_00 3 2019-01-25 700 31.12.2019
1736_00 3 2019-10-23 920 31.12.2019
1742_00 1 2017-05-21 0 20.12.2017
1742_00 1 2017-05-21 650 20.12.2017
1742_00 2 2018-03-25 800 10.12.2018
1742_00 2 2018-10-20 950 10.12.2018

Надо получить:
PrjCode upd U_PlanWC U_EndDate
1736_00 2017-01-26 850 31.12.2017
1736_00 2018-01-25 2050 31.12.2018
1736_00 2018-10-25 2650 31.12.2018
1736_00 2019-01-25 3350 31.12.2019
1736_00 2019-10-23 3570 31.12.2019
1742_00 2017-05-21 650 20.12.2017
1742_00 2018-03-25 1450 10.12.2018
1742_00 2018-10-20 1600 10.12.2018


т.е. считается U_PlanWC и группировка по PrjCode и LineId.

В первом "окне" (LineId=1) 850 складывается с первым значением второго "окна" (LineId=2) 1200 получается 2050,
затем к 2050 добавляется разность второго и первого значений второго окна т.е. 2050 + 600 = 2650 и т.д.

На сколько я знаю это называется нарастающий итог?!

Вот моё решение. Считается правильно но уж сильно долго:

with tt (PrjCode, LineId, Upd, U_PlanWC, delta, U_EndDate)
as
(
 select PrjCode
	 ,LineId
	 ,Upd
	 ,U_PlanWC	   
	 ,delta = isnull(U_PlanWC - LAG(U_PlanWC) over (partition by PrjCode, LineId order by Upd), U_PlanWC)	   
	 ,U_EndDate 
   from results    
)

select PrjCode
	,Upd
	,U_PlanWC
	,nxt = sum(delta) over (partition by PrjCode order by Upd rows between unbounded preceding and current row)
	,U_EndDate
  from tt


Нужный результат в nxt.

Думаю, что как то можно соптимизировать запрос но не знаю как ((
22 ноя 19, 08:54    [22022366]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом..  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3236
MAULER,

У вас нарастающий итог считается по результатам другой оконной функции, LAG(). Это разумеется долго. Мне кажется, LAG() вам здесь не нужен. Достаточно будет просто нарастающего итога.

Правда, не очень понятно, как вы в вашем запросе ухитрились исключить из вывода первые строки в каждой группе. Я не вижу никакого where...
22 ноя 19, 09:05    [22022373]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом..  [new]
MAULER
Member

Откуда:
Сообщений: 882
Ennor Tiegael
MAULER,

У вас нарастающий итог считается по результатам другой оконной функции, LAG(). Это разумеется долго. Мне кажется, LAG() вам здесь не нужен. Достаточно будет просто нарастающего итога.

Правда, не очень понятно, как вы в вашем запросе ухитрились исключить из вывода первые строки в каждой группе. Я не вижу никакого where...


where есть, но в другом запросе.
22 ноя 19, 09:10    [22022376]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом..  [new]
MAULER
Member

Откуда:
Сообщений: 882
Ennor Tiegael
MAULER,
Мне кажется, LAG() вам здесь не нужен. Достаточно будет просто нарастающего итога.


Тогда считается не правильно (( Нужно как то разность вычислять в рамках одного "окна" по LineId
22 ноя 19, 09:29    [22022394]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом..  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3236
MAULER,

Да, я понял. Тогда материализовывать в промежуточную времянку - надеюсь, этот код у вас не во вьюхе...
22 ноя 19, 10:00    [22022425]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом..  [new]
MAULER
Member

Откуда:
Сообщений: 882
Ennor Tiegael
MAULER,

Да, я понял. Тогда материализовывать в промежуточную времянку - надеюсь, этот код у вас не во вьюхе...


Код должен быть во вьюхе ((
22 ноя 19, 10:08    [22022429]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом..  [new]
Remind
Member

Откуда: UK
Сообщений: 523
План покажите или хотябы какие индексы в наличии.
22 ноя 19, 11:16    [22022507]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом..  [new]
MAULER
Member

Откуда:
Сообщений: 882
Remind
План покажите или хотябы какие индексы в наличии.


по столбцу U_PlanWC индексов нет.
22 ноя 19, 11:49    [22022546]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить