CREATE TABLE sample ( first_column int, second_column int );
Нужно сделать выборку с условием DISTINCT ON ( first_column )
Но при этом postgresql требует в ORDER BY первым полем ставить first_column
А мне нужна сортировка совсем по другому полю ( second_column ).
Можно ли такое реализовать средствами sql в postgresql не прибегая к вложенным запросам ?
Попробуйте заменить DISTINCT
Попробуйте заменить DISTINCT на GROUP BY. Мне трудно дать конкретный совет, потому что я не вижу подробностей в плане, что есть и что вы хотите получить после запроса.
Да GROUP BY тоже
Да GROUP BY тоже пробовал
скажем при вот таком запросе:
я получаю ERROR: колонка "sample.second_column" должна фигурировать в выражении GROUP BY или использоваться в агрегатной функции
Если делать GROUP BY first_column, second_column я уже не получу желаемый результат, будут выбраны first_column, с одинаковыми значениями
Пока что решением у меня является что то на подобие:
Ну дайте же данные какие-либо
Ну дайте же данные какие-либо поиграться
Может чего наковыряю
Это как пример, но мою
Это как пример, но мою ситуацию повторяет.
Предположим что есть некая online игра, в которую зарегестрированным пользователям (таблица players) можно поиграть, а результат (набранное колличество очков) фиксируется в таблице stat
INSERT INTO players (login) VALUES ('Vasya'), ('Kolya'), ('Petya'), ('Igor'), ('Roma');
Я выбираю все данные, отсортированные по полю points:
Но мне нужно, чтоб если запись уже выбрана,
то остальные записи с таким же логином (+ в данной ситуации уже с меньшим колличеством очков) - игнорировались
поле stamp сдесь не играет никакой роли
Логично наверное делать так:
ERROR: Выражения SELECT DISTINCT ON должны совпадать с изначальными выражениями ORDER BY
Или так:
ERROR: колонка "players.login" должна фигурировать в выражении GROUP BY или использоваться в агрегатной функции
P.S. я ошибся, в предыдущем посте решение с вложенным запросом не даёт желаемого результата.
> поле stamp сдесь не играет
> поле stamp сдесь не играет никакой роли
Так его надо выводить или нет?
Если нет, то проще некуда:
Наполовину решено
Вот собственно и есть нужный результат.
Но как быть с полем stamp?
Как мне указать, что нужно выбрать именно тот stamp, который присутствует в записи
с выбранным points, существует ли такая агрегаторная функция или другой метод ?
Sorry за кривую терминологию, но надеюсь задача ясна
Да прям real time общение
Прям real time общение такое
Да нужно вывести stamp, но на последовательность резултатов он не влияет.
Что-то совсем мозги заплыли
Что-то совсем мозги заплыли жиром. Подзапросом сделал, но как-то криво по-моему:
Работает, конечно, но меня не покидает сомнение, что всё можно сделать как-то изящней.
Большое спасибо за помощь
Если я не ошибаюсь в mysql GROUP BY работает совсем по другому, и если я снова таки не ошибаюсь MAX (stat.points) не дал бы результатов, так как выбиралось бы максимум только из одного значения, соответствующего выбранному полю. Зато работает конструкция GROUP BY player_id ORDER BY points.
И я считаю что это только + для postgres, так как можно решить очень много задач используя GROUP BY.
(под рукой mysql нет, по этому могу ошибатся)
Да вот и у меня в голову ничего не пришло, кроме как заджоинить stat.
Большое спасибо за помощь, ситуация всё таки более менее распространённая, наверняка здесь есть простое решение.
Пока использую ваш вариант.
Про DISTINCT ON вообще в
Про DISTINCT ON вообще в мануале написано:
Предложение DISTINCT ON не является частью стандарта SQL и иногда считается плохим стилем, потому что потенциально может привести к неожиданным результатам. При разумном использовании GROUP BY и подзапросов в FROM, данное предложение может быть опущено, но часто оно является наиболее удобной альтернативой.
А вот ещё как можно было бы
А вот ещё как можно было бы ситуацию упростить:
и потом уже