Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите пожалуйста с запросом.. / 8 сообщений из 8, страница 1 из 1
22.11.2019, 08:54
    #39892662
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста с запросом..
Здравствуйте.
Не могу нормально сделать запрос, чтобы тот выполнялся быстрее ((

Есть таблица results :
PrjCode LineId upd U_PlanWC U_EndDate1736_00 1 2017-01-26 0 31.12.20171736_00 1 2017-01-26 850 31.12.20171736_00 2 2018-01-25 1200 31.12.20181736_00 2 2018-10-25 1800 31.12.20181736_00 3 2019-01-25 700 31.12.20191736_00 3 2019-10-23 920 31.12.20191742_00 1 2017-05-21 0 20.12.20171742_00 1 2017-05-21 650 20.12.20171742_00 2 2018-03-25 800 10.12.20181742_00 2 2018-10-20 950 10.12.2018
Надо получить:
PrjCode upd U_PlanWC U_EndDate1736_00 2017-01-26 850 31.12.20171736_00 2018-01-25 2050 31.12.20181736_00 2018-10-25 2650 31.12.20181736_00 2019-01-25 3350 31.12.20191736_00 2019-10-23 3570 31.12.20191742_00 2017-05-21 650 20.12.20171742_00 2018-03-25 1450 10.12.20181742_00 2018-10-20 1600 10.12.2018

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

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

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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.

Думаю, что как то можно соптимизировать запрос но не знаю как ((
...
Рейтинг: 0 / 0
22.11.2019, 09:05
    #39892666
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста с запросом..
MAULER,

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

Правда, не очень понятно, как вы в вашем запросе ухитрились исключить из вывода первые строки в каждой группе. Я не вижу никакого where...
...
Рейтинг: 0 / 0
22.11.2019, 09:10
    #39892669
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста с запросом..
Ennor Tiegael
MAULER,

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

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


where есть, но в другом запросе.
...
Рейтинг: 0 / 0
22.11.2019, 09:29
    #39892681
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста с запросом..
Ennor Tiegael
MAULER,
Мне кажется, LAG() вам здесь не нужен. Достаточно будет просто нарастающего итога.


Тогда считается не правильно (( Нужно как то разность вычислять в рамках одного "окна" по LineId
...
Рейтинг: 0 / 0
22.11.2019, 10:00
    #39892697
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста с запросом..
MAULER,

Да, я понял. Тогда материализовывать в промежуточную времянку - надеюсь, этот код у вас не во вьюхе...
...
Рейтинг: 0 / 0
22.11.2019, 10:08
    #39892699
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста с запросом..
Ennor Tiegael
MAULER,

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


Код должен быть во вьюхе ((
...
Рейтинг: 0 / 0
22.11.2019, 11:16
    #39892748
Remind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста с запросом..
План покажите или хотябы какие индексы в наличии.
...
Рейтинг: 0 / 0
22.11.2019, 11:49
    #39892764
MAULER
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пожалуйста с запросом..
Remind
План покажите или хотябы какие индексы в наличии.


по столбцу U_PlanWC индексов нет.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите пожалуйста с запросом.. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]