Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2

Получить предыдущую запись SQL ADO

28.06.2012, 14:47. Показов 3418. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем изначально задача в том чтобы вывести все записи у которых дата из одного поля меньше чем дата другого поля следующей записи.
бда составлено в общем принципе так

1 Иванов 21.03.2012 22.05.2012
2 Иванов 24.03.2012 28.05.2012
3 Иванов 21.04.2012 22.05.2012
4 Иванов 21.03.2012 22.05.2012
5 Ивлев 21.03.2012 22.05.2012
6 Ивлев 21.03.2012 22.05.2012

Задача сейчас свелась к тому, чтобы получить последние 2 записи с одной фамилией
Составил вот такой запрос

//получаем предпоследний id идент по фио и коду
MySQL
1
(select max([Код]) from [Основные данные] sec_data where sec_data.[ФИО]=main_data.[ФИО] and  sec_data.[Код]<main_data.[Код])
а вот так
//получаем последнюю запись с каждой фио
MySQL
1
select * from [Основные данные] main_data where  main_data.[Код]=(select max([Код]) from [Основные данные] sec_data where sec_data.[ФИО]= main_data.[ФИО]) and (select count(*) from [Основные данные] sec_data where sec_data.[ФИО]=main_data.[ФИО])>1 order by [ФИО];
Что добавить к этому запросу чтобы в результатах выводилась еще и предпоследняя запись ума не приложу(( Пробовал так:

MySQL
1
 (main_data.[Код]=(select max([Код]) from [Основные данные] sec_data where sec_data.[ФИО]= main_data.[ФИО]) or main_data.[Код]=(select max([Код]) from [Основные данные] sec_data where sec_data.[ФИО]=main_data.[ФИО] and  sec_data.[Код]<main_data.[Код]))
но в таком случае похоже происходит зацикливание. в общем нужно получить последнюю и предпоследнюю запись одного ФИО. Если знаете, подскажите, пожалуйста, как.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.06.2012, 14:47
Ответы с готовыми решениями:

sql запрос, добавляющий запись не в текущую позицию, а в предыдущую
Всем Привет! У меня есть обычный запрос на добавления данных из textbox в sql таблицу: myCmd.CommandText = &quot;Insert Into Table1...

(ADO,SQL) Проверка на не существующую запись в дочерней таблице
Приветствую всех, народ. У меня возникла не решающая ситуация. Суть такая. У меня есть 2 таблицы подключенные через технологию ADO ...

ADO+MS SQL: как узнать количество обработанных строк при insert в ADO Query?
Добрый день. При выполнении запроса в MS SQL insert into ..(,,) select 0,20,'Text' where not exists (select 1 from .. where...

19
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
28.06.2012, 15:40
[XandeR], хотел бы кое-что уточнить:

1) sec_data и main_data - это у Вас алиасы таблицы "Основные данные"?

2)
Цитата Сообщение от [XandeR
1 Иванов 21.03.2012 22.05.2012
2 Иванов 24.03.2012 28.05.2012
3 Иванов 21.04.2012 22.05.2012
4 Иванов 21.03.2012 22.05.2012
5 Ивлев 21.03.2012 22.05.2012
6 Ивлев 21.03.2012 22.05.2012

Задача сейчас свелась к тому, чтобы получить последние 2 записи с одной фамилией
"Последние" имеется в виду по идентификатору?
Скажем, в случае:
1 Иванов 21.03.2012 22.05.2012
2 Иванов 24.03.2012 28.05.2012
3 Иванов 21.04.2012 22.05.2012
4 Иванов 21.03.2012 22.05.2012
5 Ивлев 21.03.2012 22.05.2012
6 Ивлев 21.03.2012 22.05.2012
13 Иванов 21.03.2012 22.05.2012
20 Ивлев 21.03.2012 22.05.2012
55 Иванов 21.03.2012 22.05.2012
Что мы должны в результате получить?
0
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
28.06.2012, 16:37  [ТС]
>> 1) sec_data и main_data - это у Вас алиасы таблицы "Основные данные"?
- Да, я ввел их для уточнения
>>
1 Иванов 21.03.2012 22.05.2012
2 Иванов 24.03.2012 28.05.2012
3 Иванов 21.04.2012 22.05.2012
4 Иванов 21.03.2012 22.05.2012
5 Ивлев 21.03.2012 22.05.2012
6 Ивлев 21.03.2012 22.05.2012
13 Иванов 21.03.2012 22.05.2012
20 Ивлев 21.03.2012 22.05.2012
55 Иванов 21.03.2012 22.05.2012

- Должны получить вот такие данные
13 Иванов 21.03.2012 22.05.2012
55 Иванов 21.03.2012 22.05.2012
6 Ивлев 21.03.2012 22.05.2012
20 Ивлев 21.03.2012 22.05.2012

А дальше организовать сравнение уже не проблема, главное как то их получить. Спасибо.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
28.06.2012, 17:37
[XandeR], не без чужой помощи:

MySQL
1
2
select [Код], [ФИО], [Дата1], [Дата2]  from [Основные данные] main_data
where [Код] in (select top 2 [Код] from [Основные данные] sec_data where sec_data.[ФИО]=main_data.[ФИО] order by [Код] desc)
1
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
28.06.2012, 19:13  [ТС]
Спасибо, но про top знаю, уже использовал. Но таким образом запросом не удасться сравнить дату 1 предпоследней записи с датой 2 последней записи. Или я что то упускаю?
Все было бы легко решаемо если бы microsoft предусмотрели возможность использования limit...
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
28.06.2012, 19:46
[XandeR], я специально свел задачу к примеру для большего понимания


Цитата Сообщение от [XandeR
1 Иванов 21.03.2012 22.05.2012
2 Иванов 24.03.2012 28.05.2012
3 Иванов 21.04.2012 22.05.2012
4 Иванов 21.03.2012 22.05.2012
5 Ивлев 21.03.2012 22.05.2012
6 Ивлев 21.03.2012 22.05.2012
13 Иванов 21.03.2012 22.05.2012
20 Ивлев 21.03.2012 22.05.2012
55 Иванов 21.03.2012 22.05.2012

- Должны получить вот такие данные
13 Иванов 21.03.2012 22.05.2012
55 Иванов 21.03.2012 22.05.2012
6 Ивлев 21.03.2012 22.05.2012
20 Ивлев 21.03.2012 22.05.2012
Цитата Сообщение от [XandeR Посмотреть сообщение
главное как то их получить
На данный момент такие данные и получаем Что надо в итоге получить?
Цитата Сообщение от [XandeR
Но таким образом запросом не удасться сравнить дату 1 предпоследней записи с датой 2 последней записи.
На примере, пожалуйста. И что это вообще за даты? Добавьте семантики немного.

Я если честно на общую задачу внимания не обратил, т.к. вы локализовали свою задачу и я на этом сделал акцент

Цитата Сообщение от [XandeR
Все было бы легко решаемо если бы microsoft предусмотрели возможность использования limit...
microsoft? А СУБД-то какая? Я-то думал, что у Вас MySQL.
1
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
29.06.2012, 02:20  [ТС]
ок еще данные. используется ADOQuery, ADO - дело рук майкрософта. limit не работает.
БД приложения автоматизации учета больных. 1я дата - назначенная дата явки, 2я дата - дата поступления. нужно выявить всех больных просрочивших прибытие более чем на неделю.
Перечитав задание и обсудив с заказчиком выявились некоторые НЕЗНАЧИТЕЛЬНЫЕ детали. Спасибо большое The_Immortal за помощь. но пока задача откладывается, т.к. была изначально сформулирвана неверно.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.06.2012, 03:00
[XandeR], ну... В общем, обращайтесь И рекомендую в следующий раз в соответствующий раздел по Базам данных (в подраздел по соответствующей СУБД) - они там лучше запросы клепают, пожалуй...

А сюда вообще что-то редко заглядывают

И все-таки:
Цитата Сообщение от The_Immortal Посмотреть сообщение
А СУБД-то какая?


Цитата Сообщение от [XandeR
limit не работает.
И не очень понял почему Вы так прицепились к этому limit'у, но насколько я помню (раз уж мы заговорили о компонентах), то у ADOQuery было что-то типа MaxRecords - может быть этой штукой можно лимитировать возвращаемый результат как раз.

Use MaxRecords to control the number of rows the provider for the ADO dataset component returns from the data source. Set MaxRecords to indicate the maximum number of rows. The default value for MaxRecords is 0 (zero), which places no limits on the result set.
0
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
29.06.2012, 11:48  [ТС]
limit имеет два параметра 1й - с какой записи, 2й - сколько записей выбирать. Это решило бы проблему с отделением последней и предпоследней записей для сравнения.
используется база данных MS Access.

Добавлено через 1 минуту
Спасибо за помощь.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.06.2012, 11:59
[XandeR], а, ну тут MaxRecords тогда не причем, да и еще вот такой факт про него интересный:
The MaxRecords property depends on functionality exposed by the underlying OLE DB provider or ODBC driver to limit the number of rows returned by the query. This functionality is optional for ODBC drivers and OLE DB providers. The Microsoft Access ODBC driver and Jet OLEDB provider do not expose this functionality. This behavior may occur for other OLE DB providers and ODBC drivers as well.
0
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
29.06.2012, 12:04  [ТС]
Еще несколько непонятных моментов обнаружил. Теперь мне нужно получить только 1 последнюю запись от каждой фамилии. Ранее я получал это таким запросом
MySQL
1
select * from [Основные данные] main_data where  main_data.[Код]=(select max([Код]) from [Основные данные] sec_data where sec_data.[ФИО]= main_data.[ФИО]) and (select count(*) from [Основные данные] sec_data where sec_data.[ФИО]=main_data.[ФИО])>1 order by [ФИО];
Но этот запрос исключает все случаи когда существует только одна запись с конкретным ФИО. А мне их также нужно выбирать. Теперь я удаляю вот эту часть
MySQL
1
and (select count(*) from [Основные данные] sec_data where sec_data.[ФИО]=main_data.[ФИО])>1
и получаю запрос
MySQL
1
select * from [Основные данные] main_data where  main_data.[Код]=(select max([Код]) from [Основные данные] sec_data where sec_data.[ФИО]= main_data.[ФИО])  order by [ФИО];
после исполнения которого приложение выдает access violation.
Также пробуя предложенный Вами запрос
MySQL
1
2
select *  from [Основные данные] main_data
where [Код] in (select top 1 [Код] from [Основные данные] sec_data where sec_data.[ФИО]=main_data.[ФИО] order by [Код] desc)
Все работает пока я не добавляю
MySQL
1
order by [ФИО]
. Тогда также access violation. В общем order by [ФИО] вызывает access violation. Но в случае когда запрос содержит дополнительное условие
MySQL
1
 and (select count(*) from [Основные данные] sec_data where sec_data.[ФИО]=main_data.[ФИО])>1
на проверку количества записей, order by [ФИО] работает. Если я меняю на 0
MySQL
1
 and (select count(*) from [Основные данные] sec_data where sec_data.[ФИО]=main_data.[ФИО])>0
снова access violation.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
29.06.2012, 12:24
[XandeR],
Цитата Сообщение от [XandeR
Теперь мне нужно получить только 1 последнюю запись от каждой фамилии.
Поясните, пожалуйста, для чего вы используете
Цитата Сообщение от [XandeR
SQL
1
ORDER BY [ФИО]
?

Разве этот запрос
SQL
1
2
SELECT *  FROM [Основные данные] main_data
WHERE [Код] IN (SELECT top 1 [Код] FROM [Основные данные] sec_data WHERE sec_data.[ФИО]=main_data.[ФИО] ORDER BY [Код] DESC)
- не выбирает последнюю запись по каждой фамилии?
0
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
30.06.2012, 11:58  [ТС]
Для сортировки по фамилии. Иначе записи вразброс

Добавлено через 40 секунд
Выбирает, но сортировка все равно нужна
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.06.2012, 12:51
[XandeR],
Цитата Сообщение от [XandeR
Тогда также access violation. В общем order by [ФИО] вызывает access violation.
Странно... Попробуйте в самом аксессе:
SQL
1
2
SELECT *  FROM [Основные данные] main_data
WHERE [Код] IN (SELECT top 1 [Код] FROM [Основные данные] sec_data WHERE sec_data.[ФИО]=main_data.[ФИО] ORDER BY [Код] DESC) ORDER BY [ФИО] ASC
1
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
30.06.2012, 15:17  [ТС]
Access сказал что "Введенное значение не подходит для данного свойства" и в результате запроса выдал полный список записей(

Подскажите как сделать сравнение с текущей датой? Вообще требуется к полю [Дата явки] прибавить 7 дней и сравнить с текущей. Буду благодарен любой подсказке касательно дат.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.06.2012, 20:23
[XandeR],

Цитата Сообщение от [XandeR
Access сказал что "Введенное значение не подходит для данного свойства" и в результате запроса выдал полный список записей(
А у меня нормально реагирует. Но может быть я не так понял, что Вы хотели там. В общем смотрите по скринам как у меня срабатывает (исходные данные, запрос, результат запроса) - сортировка фамилий по возрастанию:
Миниатюры
Получить предыдущую запись SQL ADO   Получить предыдущую запись SQL ADO   Получить предыдущую запись SQL ADO  

0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.06.2012, 20:29
[XandeR],

Цитата Сообщение от [XandeR
Подскажите как сделать сравнение с текущей датой? Вообще требуется к полю [Дата явки] прибавить 7 дней и сравнить с текущей. Буду благодарен любой подсказке касательно дат.
Ну вот я Вам примерчик накидал. Идет сравнение текущей даты, с датой явки + 7 дней. Если, текущая дата больше, то выводится текущая дата. Иначе - дата явки.

SQL
1
SELECT IIF(DATE() > [ДатаЯвки]+7, DATE(), [ДатаЯвки]) AS [Сравнение] FROM ОсновныеДанные
Миниатюры
Получить предыдущую запись SQL ADO   Получить предыдущую запись SQL ADO  
Изображения
 
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
30.06.2012, 23:36
Тестим, тестим

Еще раз тестим!

Добавлено через 2 часа 56 минут
[XandeR], прошу прощения, это сообщение к теме отношения никакого не имеет - я с картинками игрался! :-)
0
 Аватар для [XandeR]
31 / 31 / 3
Регистрация: 18.03.2009
Сообщений: 381
Записей в блоге: 2
01.07.2012, 18:59  [ТС]
Супер, спасибо. Про IIF не знал даже
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
01.07.2012, 21:54
[XandeR], дык шо спасибо-то? Основная проблема решилась?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2012, 21:54
Помогаю со студенческими работами здесь

Запрос на предыдущую запись
Доброго времени суток! Подскажите пожалуйста, как в запросе сделать выборку так, чтобы показывало только предыдущую запись?

Опять про предыдущую запись
Хочу вычислить среднюю стоимость остатка – ( * + *)/(+) Сделал запрос – srednaia cena ostatka, где sred_cena_ostatka: (*...

Переход на следующую/предыдущую запись бд
Доброго времени суток! Столкнулся с такой проблемой: есть некая таблица с полями name, surname, city. Надо вывести на web страницу первую...

Вычисление суммы за предыдущую дату MS SQL
Здравствуйте! Помогите решить проблему. Не получается правильно составить запрос. Для того, чтобы получить количество товара на...

T-SQL получить последнюю запись удовлетворяющую условию
Как получить последнюю запись удовлетворяющую условию Например DECLARE @UserId BIGINT; SELECT @UserId = U.UserId FROM ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru