Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Группировка с суммированием и последняя запись / 17 сообщений из 17, страница 1 из 1
08.10.2019, 14:59
    #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
08.10.2019, 16:11
    #39873469
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с суммированием и последняя запись
LiYingдолжна возвратить значение последней строки в рамке окнаОна и возвращается. Просто окно по дефолту - BETWEEN UNBOUNDDED PRECEIDING AND CURRENT_RECORD. То есть до текущей запис, а не до последней в партиции при указанной сортировке.

Самое простое решение - реверсируйте сортировку и берите FIRST_VALUE().
...
Рейтинг: 0 / 0
08.10.2019, 16:11
    #39873470
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с суммированием и последняя запись
PS. Сортировка ОБЯЗАНА быть указана в определении окна.
...
Рейтинг: 0 / 0
08.10.2019, 16:39
    #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
08.10.2019, 16:58
    #39873505
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с суммированием и последняя запись
Создайте модельный fiddle (скажем, на https://dbfiddle.uk/?rdbms=mysql_8.0).
...
Рейтинг: 0 / 0
08.10.2019, 16:59
    #39873507
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с суммированием и последняя запись
ps. подозреваю, что period таки datetime и имеет компоненту времени...
...
Рейтинг: 0 / 0
09.10.2019, 08:49
    #39873734
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с суммированием и последняя запись
Akina,

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

Код: sql
1.
period date DEFAULT NULL
...
Рейтинг: 0 / 0
09.10.2019, 09:19
    #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
09.10.2019, 09:33
    #39873761
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Группировка с суммированием и последняя запись
Akina,

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

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


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