powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Группировка с суммированием и последняя запись
17 сообщений из 17, страница 1 из 1
Группировка с суммированием и последняя запись
    #39873413
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Подскажите, пожалуйста, как правильно написать запрос. MySQL 8.0
Например, в таблице data хранятся такие данные:
idaccountperiodareapayment1777'2018-05-01'49.810021001'2018-05-01'55.5513777'2018-06-01'49.820041001'2018-06-01'55.5425777'2018-07-01'46.030061001'2018-07-01'55.533
Нужно выбрать оплаты (payment) по каждому аккаунту (account) и показать последнее значение площади (area) за период (period). Такой запрос:
Код: sql
1.
2.
3.
4.
SELECT account,area,SUM(payment)
FROM data
WHERE period BETWEEN '2018-05-01' AND '2018-07-01'
GROUP BY account


выдаст
accountareapayment77749.8600100155.556
Т.е. для площади показывается первое значение за период. Хотелось бы получить такой результат:
accountareapayment77746.0600100155.536
Как выбрать последнюю запись в группе для площади? Попытался использовать оконную функцию
Код: sql
1.
2.
3.
4.
SELECT account,LAST_VALUE(area) OVER(PARTITION BY account),SUM(payment)
FROM data
WHERE period BETWEEN '2018-05-01' AND '2018-07-01'
GROUP BY account


Насколько понял из описания функции, должна возвратить значение последней строки в рамке окна, но результат прежний.
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39873469
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingдолжна возвратить значение последней строки в рамке окнаОна и возвращается. Просто окно по дефолту - BETWEEN UNBOUNDDED PRECEIDING AND CURRENT_RECORD. То есть до текущей запис, а не до последней в партиции при указанной сортировке.

Самое простое решение - реверсируйте сортировку и берите FIRST_VALUE().
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39873470
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. Сортировка ОБЯЗАНА быть указана в определении окна.
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39873493
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Попробовал раздвинуть окно, но любое одно из выражений
Код: sql
1.
2.
3.
4.
FIRST_VALUE(area_cur) OVER (PARTITION BY account ORDER BY period DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FIRST_VALUE(area_cur) OVER (PARTITION BY account ORDER BY period ASC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
LAST_VALUE(area_cur) OVER (PARTITION BY account ORDER BY period DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
LAST_VALUE(area_cur) OVER (PARTITION BY account ORDER BY period ASC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)


дает 49.8 для аккаунта 777, а не нужное 46.0.
Где еще накосячил?
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39873505
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создайте модельный fiddle (скажем, на https://dbfiddle.uk/?rdbms=mysql_8.0).
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39873507
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ps. подозреваю, что period таки datetime и имеет компоненту времени...
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39873734
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Создал - https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b978c8b0816b4b6d14af516a90d942c8

Код: sql
1.
period date DEFAULT NULL
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39873753
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок. Источник ошибки понятен.

Оконная функция применяется к итоговому набору. В данном случае - после группировки. Группировка оставляет ОДНУ запись, а поле area в ней получает случайное значение (в данном случае - первое по кластерному индексу, т.е. для минимального id в группе).

Правильный запрос выглядит так:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT DISTINCT
       account, 
       SUM(payment) OVER (PARTITION BY account) sum_payment,
       FIRST_VALUE(area) OVER (PARTITION BY account ORDER BY period DESC) last_area
FROM data
WHERE period BETWEEN '2018-05-01' AND '2018-07-01'
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39873761
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Большое спасибо за разъяснение и помощь, всё работает!
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39874376
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39874446
LiYing
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,

ФАК этот читал, конечно же. Но там нет ни слова про использование оконных функций в теме. Можно туда внести мой пример.
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39874454
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiYingтам нет ни слова про использование оконных функций в темеЭто неудивительно. ФАК писан для пятых версий, которые не подозревают о существовании оконных функций. А для восьмёрки этот ФАК неактуален, там эта задача-то в общем тривиальна, если помнить о том, что есть оконные функции, и уж тем более если не жадничать на CTE.
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39874552
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если просто написать ORDER BY period DESC ?
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39874554
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или max(period)
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39874555
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я надеюсь, period имеет тип data ?
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39874556
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max(period) не оно, там последняя area нужна
но ORDER BY то должен сработать
...
Рейтинг: 0 / 0
Группировка с суммированием и последняя запись
    #39874571
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
полудухmax(period) не оно, там последняя area нужна
но ORDER BY то должен сработать
max(id) ?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Группировка с суммированием и последняя запись
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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