powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сортируй, не сортируй, всё равно получишь...
13 сообщений из 13, страница 1 из 1
Сортируй, не сортируй, всё равно получишь...
    #39876093
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
В MS Access есть замечательные агрегатные функции, которых сильно не хватает в MySql
Например, мне надо сгруппировать записи, и получить последнее внесённое значение. Я бы использовал функцию Last, но здесь её нет.
Знаю, что можно использовать вложенный запрос с использованием MAX(код). Но сначала хочу переспросить, вдруг здесь что-то такое предвидено.
...
Рейтинг: 0 / 0
Сортируй, не сортируй, всё равно получишь...
    #39876099
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Сортируй, не сортируй, всё равно получишь...
    #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
Сортируй, не сортируй, всё равно получишь...
    #39876273
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НастаевЯ попробовал использовать last_value, но всё равно возвращается первая, а не последняя записьУказывайте фрейм полностью. Без указания при наличии ордер бай он идёт от начала группы до текущей записи.
Или используйте first_value при обратной сортировке.
...
Рейтинг: 0 / 0
Сортируй, не сортируй, всё равно получишь...
    #39876647
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНастаевЯ попробовал использовать last_value, но всё равно возвращается первая, а не последняя записьУказывайте фрейм полностью. Без указания при наличии ордер бай он идёт от начала группы до текущей записи.
Или используйте first_value при обратной сортировке.
плюсуюсь

но если ты посмотришь на код автора, то он даже partition by не указал
...
Рейтинг: 0 / 0
Сортируй, не сортируй, всё равно получишь...
    #39876684
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Leonid Kudryavtsev]Akinaон даже partition by не указал
Ничего удивительного. Я не специалист в SQL. Ща разберусь и стану Гуру, как вы :P
...
Рейтинг: 0 / 0
Сортируй, не сортируй, всё равно получишь...
    #39876696
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тут прочитал про оконные функции. Это - бомба! Иду завоёвывать мир...
...
Рейтинг: 0 / 0
Сортируй, не сортируй, всё равно получишь...
    #39876710
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оно, может, и бомба, но с парой неочевидных запалов... так что поаккуратнее. Особенно очень внимательно изучи дефолтные фреймы.
...
Рейтинг: 0 / 0
Сортируй, не сортируй, всё равно получишь...
    #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
Сортируй, не сортируй, всё равно получишь...
    #39876725
Настаев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я прочитал о том, что эти условия Over потому так и называются, что накладываются на результат запроса. Поэтому стал экспериментировать, меняя условия запроса.
Например:
Сначала было так: Where наименование = 17
Потом так: Where наименование IN(17, 19)
Логично заключить, что результат для наименования 17 должен остаться тем же.
Но он всегда получается разным.
Хм....
...
Рейтинг: 0 / 0
Сортируй, не сортируй, всё равно получишь...
    #39876747
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. понятие ПЕРВЫЙ и ПОСЛЕДНИЙ имеют смысл ТОЛЬКО тогда, когда задан порядок. Т.к. любая запись всегда может быть первой/последней. Или последний с начала или последний с конца ))) или. в крайнем случае, последний с середины )))

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

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

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

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

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

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


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