Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сортируй, не сортируй, всё равно получишь... / 13 сообщений из 13, страница 1 из 1
14.10.2019, 16:20
    #39876093
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
Всем привет!
В MS Access есть замечательные агрегатные функции, которых сильно не хватает в MySql
Например, мне надо сгруппировать записи, и получить последнее внесённое значение. Я бы использовал функцию Last, но здесь её нет.
Знаю, что можно использовать вложенный запрос с использованием MAX(код). Но сначала хочу переспросить, вдруг здесь что-то такое предвидено.
...
Рейтинг: 0 / 0
14.10.2019, 16:32
    #39876099
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
...
Рейтинг: 0 / 0
14.10.2019, 17:01
    #39876113
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
Leonid Kudryavtsev, спасибо за ссылочку
Я попробовал использовать last_value, но всё равно возвращается первая, а не последняя запись

Вот для сравнения два одинаковых запроса из Access и MySql
И вот два разных результата
Код: sql
1.
2.
3.
4.
SELECT [Заявки вложенная].Наименование, Last(Заявки.Дата) AS [Last-Дата], Last([Заявки вложенная].цена) AS [Last-цена]
FROM Заявки INNER JOIN [Заявки вложенная] ON Заявки.Код = [Заявки вложенная].док
WHERE (((Заявки.закрыт)=True) AND (([Заявки вложенная].Наименование)=17 Or ([Заявки вложенная].Наименование)=19 Or ([Заявки вложенная].Наименование)=25 Or ([Заявки вложенная].Наименование)=32))
GROUP BY [Заявки вложенная].Наименование;



Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT 
`Заявки вложенная`.Наименование, 
LAST_VALUE(Заявки.Дата) AS `Last-Дата`, 
LAST_VALUE(`Заявки вложенная`.цена) AS `Last-цена` 
FROM Заявки INNER JOIN `Заявки вложенная` ON Заявки.Код = `Заявки вложенная`.док 
WHERE (((Заявки.закрыт)=True) AND ((`Заявки вложенная`.Наименование)=17 Or (`Заявки вложенная`.Наименование)=19 Or (`Заявки вложенная`.Наименование)=25 Or (`Заявки вложенная`.Наименование)=32))
group by  `Заявки вложенная`.Наименование
...
Рейтинг: 0 / 0
14.10.2019, 21:30
    #39876273
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
НастаевЯ попробовал использовать last_value, но всё равно возвращается первая, а не последняя записьУказывайте фрейм полностью. Без указания при наличии ордер бай он идёт от начала группы до текущей записи.
Или используйте first_value при обратной сортировке.
...
Рейтинг: 0 / 0
15.10.2019, 16:19
    #39876647
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
AkinaНастаевЯ попробовал использовать last_value, но всё равно возвращается первая, а не последняя записьУказывайте фрейм полностью. Без указания при наличии ордер бай он идёт от начала группы до текущей записи.
Или используйте first_value при обратной сортировке.
плюсуюсь

но если ты посмотришь на код автора, то он даже partition by не указал
...
Рейтинг: 0 / 0
15.10.2019, 17:10
    #39876684
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
[quot Leonid Kudryavtsev]Akinaон даже partition by не указал
Ничего удивительного. Я не специалист в SQL. Ща разберусь и стану Гуру, как вы :P
...
Рейтинг: 0 / 0
15.10.2019, 17:38
    #39876696
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
Я тут прочитал про оконные функции. Это - бомба! Иду завоёвывать мир...
...
Рейтинг: 0 / 0
15.10.2019, 18:17
    #39876710
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
Оно, может, и бомба, но с парой неочевидных запалов... так что поаккуратнее. Особенно очень внимательно изучи дефолтные фреймы.
...
Рейтинг: 0 / 0
15.10.2019, 18:42
    #39876719
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
Akina, поюзал я функцию LastValue
Какой-то результат с потолка берёт
Понимаю, что никому не интересно в чужие запросы вникать, но раз уж я затронул эту тему, должен показать

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  `Заявки вложенная`.код,
  Заявки.Дата AS дата,
  LAST_VALUE(Заявки.Дата) OVER (PARTITION BY `Заявки вложенная`.Наименование) AS LastDate
FROM Заявки
  INNER JOIN `Заявки вложенная`
    ON Заявки.Код = `Заявки вложенная`.док
WHERE ((Заявки.закрыт = TRUE)
AND ((`Заявки вложенная`.Наименование = 17)))
ORDER BY 1
...
Рейтинг: 0 / 0
15.10.2019, 18:58
    #39876725
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
Я прочитал о том, что эти условия Over потому так и называются, что накладываются на результат запроса. Поэтому стал экспериментировать, меняя условия запроса.
Например:
Сначала было так: Where наименование = 17
Потом так: Where наименование IN(17, 19)
Логично заключить, что результат для наименования 17 должен остаться тем же.
Но он всегда получается разным.
Хм....
...
Рейтинг: 0 / 0
15.10.2019, 19:42
    #39876747
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
1. понятие ПЕРВЫЙ и ПОСЛЕДНИЙ имеют смысл ТОЛЬКО тогда, когда задан порядок. Т.к. любая запись всегда может быть первой/последней. Или последний с начала или последний с конца ))) или. в крайнем случае, последний с середины )))

LAST_VALUE(Заявки.Дата) OVER (PARTITION BY `Заявки вложенная`.Наименование)

идет лесом. Вы order by не указали (и остальные описатели для окна/фрейм).
Т.ч. это команда эквивалентна: дай первое попавшиеся
И в результате ошибка "первое попавшиеся не попало" просто неизбежна

НО order by Вам все равно не поможет. т.к.

2.
AkinaУказывайте фрейм полностью. Без указания при наличии ордер бай он идёт от начала группы до текущей записи.
Или используйте first_value при обратной сортировке.
...
Рейтинг: 0 / 0
15.10.2019, 22:37
    #39876785
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
Настаевпоюзал я функцию LastValue
Какой-то результат с потолка берётАга. Это ты как раз те самые грабли. Две штуки.

LAST_VALUE, функция, явно зависящая от сортировки, у тебя используется без ORDER BY - то есть ты по определению попросил любую случайную хрень.

Но даже будь сортировка... дефолтно фрейм при наличии ORDER BY определяется как ROWS BETWEEN UNBOUNDED PRECEIDING AND CURRENT RECORD. А вовсе даже не UNBOUNDED FOLLOWING.
...
Рейтинг: 0 / 0
21.10.2019, 22:01
    #39879606
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортируй, не сортируй, всё равно получишь...
Akina, да, я понял уже. Спасибо... Теперь пашет, как тёща на огороде.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сортируй, не сортируй, всё равно получишь... / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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