powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на актуальную дату
16 сообщений из 16, страница 1 из 1
Запрос на актуальную дату
    #39875767
OkeTurel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Помогите с запросом, пожалуйста!

Была таблица с полями: ФИО, группа детсада, ДатаНачала, ДатаОкончания. В таблице было отражено движение детей по группам детсада. Например, с 01.09.2017 по 31.08.2018 - ребенок в ясельной группе, а с 01.09.2018 по 31.08.2019 - в младшей. И так дальше вплоть до подготовительной группы. Замечу, что переход из группы в группу не всегда был с 1 сентября, ребенок может перевестись в любой день в группу постарше или помладше.
Необходимо запросом получать данные на конкретную дату о составе групп.
Раньше я писала так: SELECT ФИО, группа FROM Таблица WHERE ДатаНачала <= [РасчетнаяДата] AND ДатаНачала >= [РасчетнаяДата]. Подозреваю, что и с BETWEEN работало бы.

Но потом я решила, что указывать две даты в таблице - это избыточность. Ведь между датой окончания и следующей за ней датой начала никогда не бывает разрыва - ребенок не может быть вне группы, он обязательно в какой-то группе. Я убрала ДатуОкончания.
Таблица стала: ФИО, группа детсада, ДатаНачала.
По прежнему необходимо запросом получать данные на конкретную дату о составе групп.
Я пыталась вложенным запросом типа: тра-ля-ля WHERE ДатаНачала = (SELECT MAX (ДатаНачала) FROM Таблица WHERE ДатаНачала <= [РасчетнаяДата]). Но выдает не то.

Не можете ли подсказать?
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39875797
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OkeTurel,подозреваю, что запрос был
Код: sql
1.
2.
3.
SELECT ФИО, группа 
FROM Таблица 
WHERE ДатаНачала <= [РасчетнаяДата] AND ДатаОкончания>= [РасчетнаяДата]

?
Используй коррелированный подзапрос
Код: sql
1.
2.
3.
SELECT t1.ФИО, t1.группа 
FROM Таблица t1
WHERE t1.ДатаНачала <= [РасчетнаяДата] AND (SELECT Nz(Min(t2.ДатаНачала), Date)  FROM Таблица as t2 WHERE t2.ФИО=t1.ФИО AND t2.ДатаНачала>t1.ДатаНачала) >= [РасчетнаяДата]



Как-то так...
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39875939
OkeTurel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург, да, запрос был WHERE ДатаНачала <= [РасчетнаяДата] AND ДатаОкончания>= [РасчетнаяДата].

Нет, не получается. Выдает всех детей во всех группах, в том исле в тех, из которых они уже перешли.
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39875952
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OkeTurel,

А если так?
Код: sql
1.
2.
3.
4.
5.
SELECT ФИО, группа 
FROM Таблица 
WHERE 
ДатаНачала <= [РасчетнаяДата] AND 
DCount("*", "Таблица", "ФИО=""" & ФИО & """ AND ДатаНачала > " & ДатаНачала) = 0
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39875954
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OkeTurelНет, не получается. Выдает всех детей во всех группах, в том исле в тех, из которых они уже перешли.Дай-ка пример.
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39875970
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OkeTurel,
-для начала прочтите про формирование строки WHERE для дат тынц
-навряд ли возможно полноценно ответить на Ваш вопрос не видя схему БД
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39875982
OkeTurel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример.

Michelle, сейчас попробую.
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39876139
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OkeTurel, Должно быть как-то так
Код: sql
1.
2.
3.
SELECT t1.ФИО, t1.группа 
FROM Таблица t1
WHERE t1.ДатаНачала <= [РасчетнаяДата] AND (SELECT Nz(Min(t2.ДатаНачала), Date)  FROM Таблица as t2 WHERE t2.ФИО=t1.ФИО AND t2.ДатаНачала>t1.ДатаНачала) > [РасчетнаяДата]


Дата вводилась видимо пограничная.

Ну и неплохо бы вводить дату закрытия - воспитанник уходит из д/с.
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39876296
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OkeTurel,

Код: sql
1.
2.
3.
4.
5.
SELECT ФИО, ДатаНачала, Группа_ИД 
FROM Таблица AS T
WHERE 
ДатаНачала <= РасчетнаяДата AND 
(SELECT Count("*") FROM Таблица WHERE ФИО = T.ФИО AND ДатаНачала > T.ДатаНачала) = 0
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39882286
OkeTurel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, Панург и Michelle, работает и то и то. Единственное - долговато формирует сводную таблицу по этому запросу.
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39882447
Adilby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OkeTurelЕдинственное - долговато формирует сводную таблицу по этому запросу.
Вот запрос должен работать быстро:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT Таблица.ФИО, Таблица.Группа_ИД, ТаблицаДата.РасчетнаяДата
FROM Таблица INNER JOIN (
SELECT Таблица.ФИО, Max(Таблица.ДатаНачала) AS MaxDate, CDate([Актуальная дата]) AS РасчетнаяДата
FROM Таблица
WHERE (((Таблица.ДатаНачала)<=[Актуальная дата]))
GROUP BY Таблица.ФИО
)  AS ТаблицаДата ON (Таблица.ФИО = ТаблицаДата.ФИО) AND (Таблица.ДатаНачала = ТаблицаДата.MaxDate);
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39882511
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
OkeTurel,

В целом это нормальная практика хранить даты начала и окончания периода в одной записи, если не хочется вести дату окончания вручную, то можно это поручить триггеру. Имея все данные в одной строке проще индексы настроить, альтернатива падение производительности. Так что плюсов для хранения даты окончания больше.
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39886822
OkeTurel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adilby, действительно быстрее. Спасибо.
Swa111, когда я хранила дату окончания, было гораздо удобней. Даже не знаю. Я поняла из учебников по базам данных, что избыточность - это плохо. Но если удобней? Даже не знаю.
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39886887
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OkeTurel
...Я поняла из учебников по базам данных, что избыточность - это плохо. Но если удобней? Даже не знаю.
Там же частенько говорится о том что все зависит от конкретных условий. Ведь повторять в таблицах ФИО клиента(данные уже содержащиеся в некой таблице) это одно,а записать в таблицу данные которые будут только в ней-совсем другое,тем более что это значительно упростит работу с данными. Впрочем,взвесив все "за" и "против" принимайте решение сами.
Лично я не вижу в этом нарушения основных правил "базостроения"
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39887133
Фотография Лапух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku,

Все зависит от того, быстро ли и сноровисто ли , ну и естественно - правильно ли ты умеешь готовить запросы и процедуры с запросами..
В особо сложных случаях, когда знаний и опыта не хватает, ну прям специально денормализую.
Но это особые случаи, а не когда в 100 таблицах дублируются по десятку полей.
Норму тоже нужно знать.
По слухам есть 4 и даже 5 нормализации, но это наверное вааще "Зашквар", которого в этой жизни не достичь, разве что только через 5-6 следующих жизней.
...
Рейтинг: 0 / 0
Запрос на актуальную дату
    #39887798
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон,не туда
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос на актуальную дату
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]