Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] SQL Выбор записей с максимальным значением (http://forum.oszone.net/showthread.php?t=208788)

tarakan1983 12-06-2011 06:50 1692962

SQL Выбор записей с максимальным значением
 
Есть таблица вида

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 1693012

База данных какая?

Попробуй так.
Код:

SELECT id, Lastname, Firstname, Fathername, id_fl FROM NACHISLENIE WHERE id>(MAX(id)-3) GROUP BY id_fl;

LilLoco 12-06-2011 12:26 1693056

Цитата:

Цитата tarakan1983
Нужно отобрать записи с максимальным ID »

Цитата:

Цитата tarakan1983
id (уникальное поле) »

Как при таких условиях, запрос может вернуть :
Цитата:

Цитата tarakan1983
т.е. в данном примеры записи с id 5,6 и 7 »

Если записи уникальны, максимальное значение - одно!

tarakan1983 12-06-2011 14:15 1693106

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 1693113

Цитата:

Цитата tarakan1983
ничего не понял... »

В Вашем примере максимальный ID - 8,
Цитата:

Цитата tarakan1983
с максимальным ID »

и
Цитата:

Цитата tarakan1983
записи с id 5,6 и 7 »

не совсем сходится...
Цитата:

Цитата tarakan1983
ругается на запрос. »

ужно чуть изменить его
Цитата:

Цитата tarakan1983
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 1693115

Цитата:

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

Есть таблица Nachislenie, где хранятся все начисления людей, нужно отобрать людей с последними начислениями.

Любезный 12-06-2011 14:28 1693117

Что значит "ругается"? Текст ошибки - в студию.

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

tarakan1983 12-06-2011 14:29 1693118

Цитата:

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 1693119

Видоизмените, как описано в посте LiLoco. Должно помочь.

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

tarakan1983 12-06-2011 14:52 1693136

Цитата:

Цитата Любезный
что значит "с последними начислениями"? Последними по времени?»

Да, есть поле с датой начисления, но оно типа varchar.
Цитата:

Цитата Любезный
Что за поле id_fl? »

это id физического лица из таблицы FL.
Цитата:

Цитата Любезный
Видоизмените, как описано в посте LiLoco. Должно помочь. »

Ругается на "-3"

LilLoco 12-06-2011 15:14 1693146

Цитата:

Цитата tarakan1983
Ругается на "-3" »

Попробуйте скобку передвинуть перед - 3...

Любезный 12-06-2011 15:15 1693147

Тогда - небольшую правку.
Код:

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 1693149

Цитата:

Цитата Любезный
Тогда - небольшую правку. »

ругается
Цитата:

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 1693153

Цитата:

Цитата tarakan1983
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 1693156

Цитата:

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

В смысле?

Любезный 12-06-2011 15:38 1693167

Какие компоненты используете?

tarakan1983 12-06-2011 15:40 1693169

SQL Manager for InterBase & Firebird

Любезный 12-06-2011 15:46 1693178

Странно... Не пойму, почему не работал тот вариант.

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

tarakan1983 12-06-2011 15:47 1693179

Всем спасибо за участие

tarakan1983 12-06-2011 17:18 1693244

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

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

Любезный 13-06-2011 11:48 1693524

Ничего не понял.
Цитата:

Цитата tarakan1983
Нужно из таблицы Людей выбрать всех людей и проставить и максимальное ID из таблицы Nachislenie, если такого нет то проставить 0(или null). »

Цитата:

Цитата tarakan1983
Если у Иванова в таблице Nachislenie начисление с максимальным id - 21875, а у петрова в таблице nachislenie нет ничего. Должно получиться: »

А что, разве в той выборке, которая уже есть, что-то не так?

tarakan1983 13-06-2011 12:10 1693530

та выборка отбирает только из одной таблицы, а вот эта из двух
Код:

SELECT L.ID,L."LASTNAME",T.MaxId,n.*  FROM FL L    LEFT JOIN (SELECT L1.ID,MAX(N1.ID) AS MaxId FROM FL L1,NACHISLENIE N1 WHERE L1.ID=N1.ID_FL GROUP BY L1.ID) T ON T.ID=L.ID    LEFT JOIN NACHISLENIE N ON N.ID=T.MaxId

tarakan1983 13-06-2011 13:01 1693549

Все конечно отлично, но если записей оооооооочень много, а комп древний то подвисает программка, не в курсе случайно куда засунуть Application.ProcessMessages, а еще было бы круче как отобразить процесс в progressbare?

Любезный 13-06-2011 18:31 1693722

Не понял... Вы же написали, через какую программу Вы работаете. У вас есть её исходники? Зачем засовывать ProcessMessages в чужую прогу?

tarakan1983 13-06-2011 20:40 1693783

SQL Manager for InterBase & Firebird я использую для отладки скриптов SQL, чтобы убедиться в правильноти работы select * from ..., потом в delphi использую компонент ibquery. Вот я добавил выше указаннный скрипт в IbQuery и сделал его active равным true, если записей много то моя программа замерзает. SQL Manager for InterBase & Firebird это обыкновенный менеджер по работе с БД InterBase & Firebird.

Любезный 13-06-2011 21:01 1693797

Виснет при Active:=true или при обходе записей?

Индексы на таблицы задавались? А первичные и внешние ключи?

tarakan1983 13-06-2011 21:02 1693798

Первичные ключи да, Индексы и внешние ключи нет.

Любезный 13-06-2011 22:57 1693891

Хорошо бы Вам про индексы почитать в книжке по БД - их создание должно ускорить процесс выборки.

tarakan1983 13-06-2011 23:01 1693894

Вот сейчас почитал и создал пару индексов, но все равно, выборка записей идет из таблицы где больше 10000 записей и висяк присутствует.

Любезный 14-06-2011 00:13 1693921

ProcessMessages на самом деле засовывать некуда, ибо сама выборка ведётся на сервере.

На мой взгляд, 10 тыс записей - это не так уж много. Наверно, Вам лучше обратиться на профильный форум SQL.RU - там, полагаю, смогут подсказать, как создавать индексы правильно.


Время: 13:05.

Время: 13:05.
© OSzone.net 2001-