Войти

Показать полную графическую версию : [решено] SQL Выбор записей с максимальным значением


Страниц : [1] 2

tarakan1983
12-06-2011, 06:50
Есть таблица вида

id (уникальное поле)****Lastname****Firstname*****Fathername*****id_fl
1******************** Иванов******Иван******** Иванович*******3
2*********************Петров******Петр*********Петрович*******4
3*********************Сидоров*****Сидор********Сидорович*****5
4*********************Иванов******Иван*********Иванович******3
5*********************Петров******Петр**********Петрович*****4
6*********************Сидоров*****Сидор********Сидорович****5
7*********************Петров******Петр*********Петрович*****4
8*********************Иванов******Иван*********Иванович*****3

Нужно отобрать записи с максимальным ID, т.е. в данном примеры записи с id 5,6 и 7.
Помогите пожалуйста.
пишу
select id_fl, MAX(id) from NACHISLENIE group by id_fl
отбирает только 2 колонки id_fl и max, если в запрос добавляю еще колонку, то ругается.

Любезный
12-06-2011, 10:41
База данных какая?

Попробуй так.
SELECT id, Lastname, Firstname, Fathername, id_fl FROM NACHISLENIE WHERE id>(MAX(id)-3) GROUP BY id_fl;

LilLoco
12-06-2011, 12:26
Нужно отобрать записи с максимальным ID »
id (уникальное поле) »
Как при таких условиях, запрос может вернуть :
т.е. в данном примеры записи с id 5,6 и 7 »
Если записи уникальны, максимальное значение - одно!

tarakan1983
12-06-2011, 14:15
LilLoco, ничего не понял...
База данных какая? »
*.gdb
SELECT id, Lastname, Firstname, Fathername, id_fl FROM NACHISLENIE WHERE id>(MAX(id)-3) GROUP BY id_fl;
ругается на запрос.

LilLoco
12-06-2011, 14:22
ничего не понял... »
В Вашем примере максимальный ID - 8,
с максимальным ID »
и
записи с id 5,6 и 7 »
не совсем сходится...
ругается на запрос. »
ужно чуть изменить его
SELECT id, Lastname, Firstname, Fathername, id_fl FROM NACHISLENIE WHERE id>(SELECT MAX(id) FROM NACHISLENIE - 3) GROUP BY id_fl; »
Но он вернет тоже, не то что Вам нужно...

З.Ы. И вообще из условия не ясно, что Вам нужно...

tarakan1983
12-06-2011, 14:26
З.Ы. И вообще из условия не ясно, что Вам нужно... »
Есть таблица Nachislenie, где хранятся все начисления людей, нужно отобрать людей с последними начислениями.

Любезный
12-06-2011, 14:28
Что значит "ругается"? Текст ошибки - в студию.

И ещё - версия Interbase/Firebird какая?

tarakan1983
12-06-2011, 14:29
Invalid token. Dynamic SQL Error. SQL error code = -104. Cannot use an aggregate function in a WHERE clause, use HAVING instead.
Вот

Любезный
12-06-2011, 14:30
Видоизмените, как описано в посте LiLoco. Должно помочь.

Кстати, что значит "с последними начислениями"? Последними по времени? Что за поле id_fl?

tarakan1983
12-06-2011, 14:52
что значит "с последними начислениями"? Последними по времени?»
Да, есть поле с датой начисления, но оно типа varchar.
Что за поле id_fl? »
это id физического лица из таблицы FL.
Видоизмените, как описано в посте LiLoco. Должно помочь. »
Ругается на "-3"

LilLoco
12-06-2011, 15:14
Ругается на "-3" »
Попробуйте скобку передвинуть перед - 3...

Любезный
12-06-2011, 15:15
Тогда - небольшую правку.
SELECT id, Lastname, Firstname, Fathername, id_fl FROM NACHISLENIE WHERE id>((SELECT MAX(id) FROM NACHISLENIE) - 3) GROUP BY id_fl;

Но если надо группировать по дате начисления, тогда надо задействовать соответствующее поле.

tarakan1983
12-06-2011, 15:19
Тогда - небольшую правку. »
ругается
Invalid token. Dynamic SQL Error. SQL error code = -104. Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
вроде работает так

SELECT id, Lastname, Firstname, Fathername FROM NACHISLENIE a INNER JOIN ( SELECT id_fl, MAX(id) AS maxID FROM NACHISLENIE GROUP BY id_fl ) b ON a.id = b.maxID ORDER BY a.lastname

Любезный
12-06-2011, 15:26
Invalid token. Dynamic SQL Error. SQL error code = -104. Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause). »

Удивительно. А по какой технологии работаете с БД?

tarakan1983
12-06-2011, 15:30
Удивительно. А по какой технологии работаете с БД? »
В смысле?

Любезный
12-06-2011, 15:38
Какие компоненты используете?

tarakan1983
12-06-2011, 15:40
SQL Manager for InterBase & Firebird

Любезный
12-06-2011, 15:46
Странно... Не пойму, почему не работал тот вариант.

Ну ладно. главное, что решение нашлось.

tarakan1983
12-06-2011, 15:47
Всем спасибо за участие

tarakan1983
12-06-2011, 17:18
Прошу прощенья, сделал поспешный вывод или неправильно поставил задачу.
Нужно из таблицы Людей выбрать всех людей и проставить и максимальное ID из таблицы Nachislenie, если такого нет то проставить 0(или null). Т.е. Если у Иванова в таблице Nachislenie начисление с максимальным id - 21875, а у петрова в таблице nachislenie нет ничего. Должно получиться:

Иванов ----------- 21875
Петров-------------0 (ну или null)




© OSzone.net 2001-2012