Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / first_value = top, last_value = ? / 7 сообщений из 7, страница 1 из 1
22.04.2019, 23:04
    #39805101
dklim.kzn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
first_value = top, last_value = ?
ответы то я нашел, но осадочек остался

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

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

может быть я снова не дочитал книжек?
только оконками?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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



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



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

или будет быстрее это?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
23.04.2019, 00:52
    #39805117
dklim.kzn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
first_value = top, last_value = ?
однако, чуть быстрее второе
ну никакого единобезобразия...

оценка производилась на columnstore таблице без дополнительных индексов
...
Рейтинг: 0 / 0
23.04.2019, 00:55
    #39805120
dklim.kzn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
first_value = top, last_value = ?
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: )
...
Рейтинг: 0 / 0
23.04.2019, 01:17
    #39805123
dklim.kzn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
first_value = top, last_value = ?
еще чуть быстрее (5%) если дать одинаковые границы окна

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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
...
Рейтинг: 0 / 0
23.04.2019, 09:55
    #39805197
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
first_value = top, last_value = ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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;
...
Рейтинг: 0 / 0
23.04.2019, 15:16
    #39805425
dklim.kzn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
first_value = top, last_value = ?
invm,

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

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

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

как руки дойдут - ещё покатаюсь, спасибо)
...
Рейтинг: 0 / 0
23.04.2019, 15:37
    #39805439
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
first_value = top, last_value = ?
в оракле есть конструкция keep dense rank first
возможно, когда-то появится и в мсскл
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / first_value = top, last_value = ? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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