С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
1

Запрос на выборку строки с максимальной датой

06.04.2017, 20:54. Показов 6470. Ответов 32
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Коллеги, привет!

Буду рад если сможете помочь!

Необходимо запросом выбирать данные из таблицы TEST_TABLE в TARGET_TEST_TABLE.
Структура таблиц одинаковая - три столбца - ID, Param, Date, Autonumber

В таблицу TEST_TABLE сваливаются активности по ID, соответсвенно ID могут повторяться много раз. Date - значение по умолчанию Now(), двух операций в секунду с одним ID быть не может, если даже вдруг может, подключу MAX по автосчетчику.

Запрос должен вставлять в таблицу TARGET_TEST_TABLE ID c максимальной датой из таблицы TEST_TABLE, другими словами для каждого ID вставить строку с последней сделанной актиностью.

Запрос на вставку абсолютно всех значений выглядит так
Visual Basic
1
2
3
DB.Execute "INSERT INTO [TARGET_TEST_TABLE] ([ID], [Date], [Param])" & _
                      "SELECT [TEST_TABLE].[ID], [TEST_TABLE].[Date], [TEST_TABLE].[Param]" & _
                "FROM [TARGET_TEST_TABLE] right JOIN [TEST_TABLE] ON [TARGET_TEST_TABLE].[ID] = [TEST_TABLE].[ID]"
Не могу понять как подключить сюда функцию SQL MAX (если возможно через WHERE), всегда ругается на синтаксис

Заранее спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.04.2017, 20:54
Ответы с готовыми решениями:

Запрос на выборку данных с максимальной датой
Помогите пожалуйста составить запрос на выборку из таблицы, только строк с максимальной датой,...

Запрос на выборку с последней датой
Есть таблица, предположим, код товара, ЛВ, адрес сбора, дата. Нужно отбросить все старые даты,...

Sql запрос за период с максимальной датой
Приветствую. Есть sql запрос с такой выборкой select...

Запрос на выборку для отображения последней строки таблицы
Добрый вечер! Уважаемые знатоки, как правильно написать запрос на выборку, чтобы в...

32
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
06.04.2017, 21:21 2
Предположительно так (???)
Visual Basic
1
2
3
4
5
6
DB.Execute "INSERT INTO [TARGET_TEST_TABLE] ([ID], [Date], [Param])" & _
               "SELECT [TEST_TABLE].[ID], [TEST_TABLE].[Date], [TEST_TABLE].[Param]" & _
               "FROM [TARGET_TEST_TABLE] right JOIN [TEST_TABLE] ON [TARGET_TEST_TABLE].[ID] = [TEST_TABLE].[ID] " & _
               "Where [TEST_TABLE].Autonumber in (select top 1 Autonumber from TEST_TABLE t " & _
               "Where t.ID=TEST_TABLE.ID " & _
               "Order by t.[Date] Desc)"
Вы говорите, что в каждой таблице 3 поля, но перечислили и 4-е - счетчик, Autonumber. Поэтому я им воспользовался.
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
06.04.2017, 21:51 3
Visual Basic
1
2
3
4
5
DB.Execute "INSERT INTO [TARGET_TEST_TABLE] ([ID], [Date], [Param]) " & _
           "SELECT [TEST_TABLE].[ID], [TEST_TABLE].[Date], [TEST_TABLE].[Param] " & _
           "FROM TEST_TABLE INNER JOIN " & _
           "(SELECT ID, Max([Date]) AS MaxDate FROM TEST_TABLE GROUP BY ID) AS Q " & _
           "ON (TEST_TABLE.ID = Q.ID) AND (TEST_TABLE.[Date] = Q.MaxDate)"
1
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
07.04.2017, 11:18  [ТС] 4
Mobile, Capi, огромное спасибо! Разобрался! Работает!

Есть еще один вопрос. Как в запросе на выборку через конструктор организовать пустое поле, которое потом заполняется другим запросом? Если ввести просто заголовок, access предлагает присвоить занчение ячейкам через inputbox

Спасибо!
0
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
08.04.2017, 16:22  [ТС] 5
Разобрался, в названии поля надо написать Название поля:Null
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
08.04.2017, 16:28 6
Цитата Сообщение от Dmitry_Morozov Посмотреть сообщение
Разобрался, в названии поля надо написать Название поля:Null
Это не название поля, а его значение.
0
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
08.04.2017, 16:42  [ТС] 7
Fieldname:null - строка в названии поля в конструкторе - это имел ввиду
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
08.04.2017, 16:58 8
Dmitry_Morozov,

Нет. Название может быть любым другим,
кроме служебных слов, к которым, кстати, относится и Null.
SQL
1
SELECT A, B, ...., NULL AS [Пустое поле] FROM.....
0
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
08.04.2017, 17:00  [ТС] 9
Естественно любым другим может быть
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
08.04.2017, 17:02 10
Цитата Сообщение от Dmitry_Morozov Посмотреть сообщение
Естественно любым другим может быть
Так Вы же в качестве "найденного решения" приводите:
Цитата Сообщение от Dmitry_Morozov Посмотреть сообщение
Разобрался, в названии поля надо написать Название поля:Null
, а это, простите, глупость.
Не различаете имя поля и значение поля.

Покажите текст запроса и результат запроса.
0
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
08.04.2017, 17:08  [ТС] 11
как глупость, то

Создание запроса в Access, режим конструктора.
Ниже таблица для полей запроса.
Первая строка по всем полям - Field, если в нем написать "Нужное название поля":null, то при выполнении запроса это будет пустой столбец с названием "Нужное название поля".
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
08.04.2017, 17:15 12
Ну так Вы и задаете таким образом значение поля.
Ладно, со временем, может, поймете...
0
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
08.04.2017, 20:00  [ТС] 13
Capi, я понимаю о чем Вы, просто мы не можем друг друга понять.

Вы говорите про то, что Fieldname - название самого столбца (поля) - может быть любым абсоляютно.
Null - значение записей в поле.

А я говорю немного с другой стороны - что если необходимо получить пустой столбей, нужно в конструкторе в поле Field прописать Fieldname:null - по факту это поле - название столбца, в котором так же задается и его значение.

Добавлено через 1 час 52 минуты
Коллеги, пытаюсь использовать подобную конструкцию в запросе UPDATE, ругется на нехватку параметров, нехватает одного, не могу понять какого

Спасибо!
Visual Basic
1
2
3
 DB.Execute "UPDATE [TARGET_TEST_TABLE] INNER JOIN (SELECT ID, Max([Date]) AS MaxDate FROM TEST_TABLE GROUP BY ID) AS Q " & _
            "ON (TARGET_TEST_TABLE.ID = Q.ID) AND (TARGET_TEST_TABLE.[Date] = Q.MaxDate)" & _
                      "SET [TARGET_TEST_TABLE].[Date]=Q.[Date]"
Заранее спасибо!

Добавлено через 24 минуты
PS Подозреваю, что вместо Q.[Date] Вернее было бы написать Q.MaxDate , в таком случае появляется ошибка

3073 - запрос должен быть обновляемым...
0
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
08.04.2017, 20:12 14
Ошибка понятно какая - в подзапросе Q нет поля Date, есть поле MaxDate. И последняя строка должна быть
Visual Basic
1
"SET [TARGET_TEST_TABLE].[Date]=Q.[MaxDate]"
Но этим ошибки не исчерпаются. Джетовский Update на дух не переносит необновляемых подзапросов и немедленно сообщит Вам об этом. Но предположу, что вместо подзапроса можно использовать функцию DMax
Visual Basic
1
2
3
4
5
6
Dim s
s="Update [TARGET_TEST_TABLE] " & _
"Set [TARGET_TEST_TABLE].[Date]=Dmax('[Date]', 'TEST_TABLE'," & _
"'ID=' & TEST_TABLE.ID & ' and [Date]=' & Format([TARGET_TEST_TABLE].[Date], '\#mm\/dd\/yyyy\#'))"
Debug.print s
DB.Execute s
Переменная s и Debug.print s введены для возможной последующей отладки распечатанного текста в конструкторе запросов

Добавлено через 1 минуту
С MaxDate и обновляемыми подзапросами опоздал. Подзадержался с апострофами
1
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
08.04.2017, 20:20  [ТС] 15
Mobile, приветствую, спасибо,

Ругается, пишет мало параметров, нехватает 1 (это вариант с дмакс)
0
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
08.04.2017, 20:30 16
Цитата Сообщение от Dmitry_Morozov Посмотреть сообщение
Ругается, пишет мало параметров, нехватает 1 (это вариант с дмакс)
Я же специально написал
Цитата Сообщение от mobile Посмотреть сообщение
Переменная s и Debug.print s введены для возможной последующей отладки распечатанного текста в конструкторе запросов
Посмотрите в Immediate (область отладки в редактора ВБА) текст запроса. Скопируйте его, откройте конструктор запросов в режиме SQL и вставьте туда скопированный текст. Попробуйте выполнить. Если будет ошибка, конструктор укажет на нее.
0
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
08.04.2017, 20:47  [ТС] 17
В Immediate выводит код ниже и конструктор ругаетя на синтаксис 'ID=1 and [Date]='
SQL
1
2
3
4
UPDATE [TARGET_TEST_TABLE]
 SET [TARGET_TEST_TABLE].[DATE]=Dmax('[Date]',
     'TEST_TABLE',
     'ID=' & TEST_TABLE.ID & ' and [Date]=' & Format([TARGET_TEST_TABLE].[DATE], '\#mm\/dd\/yyyy\#'))
mm и dd местами менял
0
Эксперт MS Access
26818 / 14497 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
08.04.2017, 21:14 18
Значит поле [Date] в [TARGET_TEST_TABLE] пустое - NULL. Возможно, что Вы хотели обновить именно записи с пустыми полями даты? Тогда так
Visual Basic
1
2
3
4
5
6
7
Dim s
s="Update [TARGET_TEST_TABLE] " & _
"Set [TARGET_TEST_TABLE].[Date]=Dmax('[Date]', 'TEST_TABLE'," & _
"'ID=' & TEST_TABLE.ID) " & _
" Where [Date] Is Null"
Debug.print s
DB.Execute s
Если же обновить надо все записи, то убрать в последней строке запроса все, что касается даты.

Если же только совпадающие по дате записи и не пустые в [TARGET_TEST_TABLE], то так
Visual Basic
1
2
"'ID=' & TEST_TABLE.ID & ' and [Date]=' & Format([TARGET_TEST_TABLE].[Date], '\#mm\/dd\/yyyy\#')) " & _
"Where Not [TARGET_TEST_TABLE].[Date] Is Null"
1
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
10.04.2017, 16:28  [ТС] 19
Коллеги, привет, чего то я ничерта не понимаю=)

из immediate беру запрос, гоняю его через конструктор, Access оворт будет обновлено n записей, далее окно с предупреждением что эти n записей не будут обновлены в связи с type violation - в обеих таблицах одинаковый тип данных всех полей (таблицы просто совпадают за исключением надора данных).

В чем проблема не пойму

Добавлено через 49 минут
+ запрос ругался на отсутствие аргумента, как оказалось, не хватало связи

Visual Basic
1
2
3
4
5
6
7
Dim s
s="Update [TARGET_TEST_TABLE] INNER JOIN [TEST_TABLE] ON [TARGET_TEST_TABLE].[VIN]=[TEST_TABLE].[VIN]" & _
"Set [TARGET_TEST_TABLE].[Date]=Dmax('[Date]', 'TEST_TABLE'," & _
"'ID=' & TEST_TABLE.ID) " & _
" Where [Date] Is Null"
Debug.print s
DB.Execute s
Но ошибка по несовпадению осталась...

Добавлено через 48 секунд
+ запрос ругался на отсутствие аргумента, как оказалось, не хватало связи

Visual Basic
1
2
3
4
5
6
7
Dim s
s="Update [TARGET_TEST_TABLE] INNER JOIN [TEST_TABLE] ON [TARGET_TEST_TABLE].[VIN]=[TEST_TABLE].[VIN]" & _
"Set [TARGET_TEST_TABLE].[Date]=Dmax('[Date]', 'TEST_TABLE'," & _
"'ID=' & TEST_TABLE.ID) " & _
" Where [Date] Is Null"
Debug.print s
DB.Execute s
Но ошибка по несовпадению осталась...

Добавлено через 20 минут
Думаю, что решу проблему в два шага

1) Ваборка инсертом во временную таблицу, т.к. апдейт нельзя сделать по селекту
2) Селект из временной таблицы, где хранятся уже исключительно нужные (максимальные) значения
3) очистка временной таблицы

Думаю, это будет оптимально

Всем спасибо за помощь!
0
21 / 4 / 0
Регистрация: 03.01.2017
Сообщений: 127
11.04.2017, 18:47  [ТС] 20
Коллеги, привет!

Подскажите, пожалуйста

Примерно таким же запросом как запрос ниже вставляю данные из одной таблицы в другую.
Но не пойму как по синтаксису правильно встроить WHERE, т.к. надо чтобы в таблицу 1 копировались только те строчки из таблицы 2, ID которых есть в таблице 3
Visual Basic
1
2
3
4
5
DB.Execute "INSERT INTO [TARGET_TEST_TABLE] ([ID], [Date], [Param]) " & _
           "SELECT [TEST_TABLE].[ID], [TEST_TABLE].[Date], [TEST_TABLE].[Param] " & _
           "FROM TEST_TABLE INNER JOIN " & _
           "(SELECT ID, Max([Date]) AS MaxDate FROM TEST_TABLE GROUP BY ID) AS Q " & _
           "ON (TEST_TABLE.ID = Q.ID) AND (TEST_TABLE.[Date] = Q.MaxDate)"
Спасибо!
0
11.04.2017, 18:47
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.04.2017, 18:47
Помогаю со студенческими работами здесь

Фото с максимальной датой вставки
Всем привет, нужно выбрать фотку с максимальной датой вставки Ошибка: The text, ntext, and...

Выбрать запись с максимальной датой
имеется таблица id nomer rdata 1 12 2015-12-21 2 11 2015-12-22 3 10 2015-12-20 4 14 2015-12-22...

Получить записи с максимальной датой за период
Добрый вечер уважаемые форумчане, столкнулся с проблемой не могу получить список записей филиалов...

Не могу скопировать файл с максимальной датой в новую папку
Ребят, тут такое дело, написал скрипт, который должен из каталога копировать именно тот файл у...

Выбрать уникальные по одному полю записи с максимальной датой для каждой
Выбрать уникальные по одному полю записи с максимальной датой для каждой пример во вложении ...

Если нужно сделать запрос на добавление, зачем предварительно делать запрос на выборку?
Есть таблица: ID_записи, поле1, поле2, поле3. Хотелось бы записать запрос на добавление записи с...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru