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

Откуда: Казань
Сообщений: 123
ответы то я нашел, но осадочек остался

нужно взять из ряда первое, последнее и сумму, например

как хорошо, что есть оконные функции, но есть ли жизнь без них?
для суммы вполне есть, так почему нет для первого и последнего?
ну ок, для первого еще можно вывернуться top
для последнего вариант очень татарский - у нас нет "назад", мы "разворачиваемся и алга" (алга - это вперед)
имею ввиду top ... order by ... desc

может быть я снова не дочитал книжек?
только оконками?
select grp, ord, first, last, summa
from (
grp, 
ord,
first_value(z) over(partition by grp order by ord) first,
first_value(z) over(partition by grp order by ord desc) last,
sum(z) over(partition by grp order by ord desc) summa,
row_number() over(partition by grp order by ord desc) rownumber
from table
) buffer
where rownumber=1


может быть более толковый вариант
last_value(z) over(partition by grp order by ord ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) last


но тут и это и всё прочее достаточно случаезависимо
достанет ли оптимизатору ума сделать сортировку лишь один раз это надо выяснять еще

или будет быстрее это?
select grp, ord, first, last, sum(z)
from (
grp, 
ord,
first_value(z) over(partition by grp order by ord) first,
last_value(z) over(partition by grp order by ord ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)  last,
z
from table
) buffer
22 апр 19, 23:04    [21869321]     Ответить | Цитировать Сообщить модератору
 Re: first_value = top, last_value = ?  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
однако, чуть быстрее второе
ну никакого единобезобразия...

оценка производилась на columnstore таблице без дополнительных индексов
23 апр 19, 00:52    [21869356]     Ответить | Цитировать Сообщить модератору
 Re: first_value = top, last_value = ?  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49 Copyright (C) 2017 Microsoft Corporation Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 17134: )
23 апр 19, 00:55    [21869359]     Ответить | Цитировать Сообщить модератору
 Re: first_value = top, last_value = ?  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
еще чуть быстрее (5%) если дать одинаковые границы окна

select grp, ord, first, last, sum(z)
from (
grp, 
ord,
first_value(z) over(partition by grp order by ord ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first,
last_value(z) over(partition by grp order by ord ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) last
from table
) buffer
23 апр 19, 01:17    [21869362]     Ответить | Цитировать Сообщить модератору
 Re: first_value = top, last_value = ?  [new]
invm
Member

Откуда: Москва
Сообщений: 9273
select
 grp,
 cast(substring(min(str(ord) + str(z)), 11, cast(0x7fffffff as int)) as int) as first,
 cast(substring(max(str(ord) + str(z)), 11, cast(0x7fffffff as int)) as int) as last,
 sum(z)
from
 table
group by
 grp;
23 апр 19, 09:55    [21869513]     Ответить | Цитировать Сообщить модератору
 Re: first_value = top, last_value = ?  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
invm,

круто, работает!

но надо смотреть
на верхнем уровне оконки поменял на такое - время исполнения выросло на четверть

я наверное и сам в дремучие года такое заряжал, да забыл уже))
однако, оконки это очень неплохо

как руки дойдут - ещё покатаюсь, спасибо)
23 апр 19, 15:16    [21869872]     Ответить | Цитировать Сообщить модератору
 Re: first_value = top, last_value = ?  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54120
+
в оракле есть конструкция keep dense rank first
возможно, когда-то появится и в мсскл
23 апр 19, 15:37    [21869894]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить