powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VB2010е, Access, Запрос к БД
25 сообщений из 54, страница 2 из 3
VB2010е, Access, Запрос к БД
    #39188647
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelleiddqd_win,

Правильно ли я понимаю, что требуется что-то вроде прогноза - каким был бы интервал, если событие произошло бы сегодня.
И средний интервал рассчитать с учетом полученного значения.
Так или нет?

Почти) Средний интервал мы рассчитали на основе предыдущих событий. И теперь нам надо спрогнозировать это событие исходя из того сколько времени прошло с последнего.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188651
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть когда рТН(р с последнего из событий Событие1 например) > рС
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188652
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win. .... И теперь нам надо спрогнозировать это событие исходя из того сколько времени прошло с последнего.... Не поняла....
Можно пример на основе все той же таблички?
Что должно появиться, если выполнить требуемое вручную?
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188653
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще.
Не увидела, чтобы запрос рТН как-то работал с "сегодня", как заявляется.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188841
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Событие ДатаБ 20.02.2016Б 25.02.2016В 27.02.2016Б 01.03.2016А 01.03.2016В 02.03.2016А 04.03.2016В 07.03.2016А 07.03.2016

А, Б, В - циклически происходящие события, но цикл не постоянен.
Интервал между датами одного события (рТ) в примере для события Б: 20.02.2016 (рТ = 5 дней) 25.02.2016 (рТ = 5 дней) 01.03.2016
Средняя периодичность каждого события (рС) это среднее арифметическое, дней между датами одного события. Для события Б рС = (5 + 5)/2 так как интервала 2 = 5 дней
Сегодня 10.03.2016. Последний раз событие Б произошло 01.03.2016 то есть сегодня рТН = DateDiff(01.03.2016, 10.03.2016) = 9 дней
Средняя же периодичность рС для события Б 5 дней. Теперь в случае когда рТН >= рС для данного события нужно получить не что такое:
Событие Последняя дата Средняя периодичность Прошло с последнего дней Б 01.03.2016 5 9
Для остальных событий:
В:
рТ = 27.02.2016 (4 дня) 02.03.2016 (5 дней) 07.03.2016
рС = 4.5
рТН = 07.03.2016 (3 дня) 10.03.2016
рТН < рС выводить не нужно
А:
рТ = 3дня, 3 дня
рС = 3дня
рТН = 07.03.2016 (3 дня) 10.03.2016
рТН=рС на вывод

Итоговая для всех событий
Событие Последняя дата Средняя периодичность Прошло с последнего дней Б 01.03.2016 5 9А 07.03.2016 3 3

Вроде все аспекты затронул)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188854
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__MichelleИ еще.
Не увидела, чтобы запрос рТН как-то работал с "сегодня", как заявляется.
Ой, да там datediff(d, Дата, Date())
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188855
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iddqd_winОй, да там datediff(d, Дата, Date())
Точнее Дата ТОР1
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188860
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Ну и допустим из жизни пример..
Скажем принтер - допустим я заправляю катриджы каждые 35 дней, с последней заправки прошло уже 45 дней, запрос будет говорить о том что скорее всего печатать придется идти куда то еще)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188884
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так?

Запрос 4.
Код: sql
1.
2.
3.
SELECT T.*, Запрос2.AvgAvg AS СредняяПериодичность, DateDiff("d",Дата,Date()) AS ПрошлоДней
FROM Таблица1 AS T INNER JOIN Запрос2 ON T.Событие = Запрос2.Событие
WHERE T.Дата = (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC);

Результат.Событие Дата СредняяПериодичность ПрошлоДнейСобытие1 04.03.2016 2 6Событие2 06.03.2016 4 4
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188927
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__MichelleТак?

Запрос 4.
Код: sql
1.
2.
3.
SELECT T.*, Запрос2.AvgAvg AS СредняяПериодичность, DateDiff("d",Дата,Date()) AS ПрошлоДней
FROM Таблица1 AS T INNER JOIN Запрос2 ON T.Событие = Запрос2.Событие
WHERE T.Дата = (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC);

Результат.Событие Дата СредняяПериодичность ПрошлоДнейСобытие1 04.03.2016 2 6Событие2 06.03.2016 4 4
Не хватает условия ПрошлоДней >= Запрос2.AvgAvg
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188951
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавьте?
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39189046
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,

Постараюсь, спасибо за помощь ещё раз! Уже замучил Вас))
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39189054
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Вроде всё верно)
Код: plsql
1.
2.
3.
SELECT T.*, рС.Средняя AS СредняяПериодичность, DateDiff("d",Дата,Date()) AS ПрошлоДней
FROM Таблица1 AS T INNER JOIN рС ON T.Событие = рС.Событие
WHERE T.Дата = (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие AND DateDiff("d",Дата,Date())>рС.Средняя ORDER BY Дата DESC);


И ещё раз огромное спасибо) Если потихоньку начинаю понимать что к чему)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39189070
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,
Нужно вот так - добавленное к Запросу 4 выделено красным:
Запрос 4
Код: sql
1.
2.
3.
4.
SELECT T.*, Запрос32.AvgAvg AS СредняяПериодичность, DateDiff("d",Дата,Date()) AS ПрошлоДней
FROM Таблица1 AS T INNER JOIN Запрос32 ON T.Событие = Запрос32.Событие
WHERE T.Дата = (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)
AND DateDiff("d",Дата,Date())>Запрос32.AvgAvg;

У Вас аналогичное выражение вставлено в подзапрос, а нужно отнести его к основному запросу.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39189101
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelleiddqd_win,
Нужно вот так - добавленное к Запросу 4 выделено красным:
Запрос 4
Код: sql
1.
2.
3.
4.
SELECT T.*, Запрос32.AvgAvg AS СредняяПериодичность, DateDiff("d",Дата,Date()) AS ПрошлоДней
FROM Таблица1 AS T INNER JOIN Запрос32 ON T.Событие = Запрос32.Событие
WHERE T.Дата = (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)
AND DateDiff("d",Дата,Date())>Запрос32.AvgAvg;

У Вас аналогичное выражение вставлено в подзапрос, а нужно отнести его к основному запросу.
Ясно, запомню этот нюанс. Хотя вроде тоже работало) Ну и по традиции еще раз спасибо)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39189109
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,

Пожалуйста!)))
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39189155
iddqd_win, чтобы определить среднюю периодичность вычислять рТ не обязательно.
Поэтому решение последней задачи, не использующее подзапроы и дополнительные сохраненные запросы, может быть таким
Код: sql
1.
2.
3.
4.
5.
6.
SELECT Событие,  Max(Дата) As ПоследняяДата, 
       (Max(Дата)-Min(Дата))/(Count(*)-1) As СредняяПериодичность, 
       Date()-ПоследняяДата As ПрошлоДней
FROM Таблица1 
GROUP BY Событие
HAVING Count(*)>1 And Date()-Max(Дата)>=(Max(Дата)-Min(Дата))/(Count(*)-1)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39195118
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-Практикант-,
Тоже работает, спасибо за короткий вариант.
Почему мне нравится с отдельными запросами, потому что периодичность событий сезонная, то есть летом допустим чаще, зимой реже. И теперь мне нужно изменить расчет рС не за все время, а скажем за последних 3-4 раза, а в идеале за последних n - раз задавая n в программе. И можно будет не переписывать весь код.
Подскажите как подобный запрос составить?
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39195220
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Доброго дня! Хочу еще раз Вас потревожить) Не подскажите как реализовать расчет периодичности рС не для всех событий а для 1, 2, n последних?
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39195353
iddqd_win-Практикант-,
Тоже работает, спасибо за короткий вариант.
Почему мне нравится с отдельными запросами, потому что периодичность событий сезонная, то есть летом допустим чаще, зимой реже. И теперь мне нужно изменить расчет рС не за все время, а скажем за последних 3-4 раза, а в идеале за последних n - раз задавая n в программе. И можно будет не переписывать весь код.
Подскажите как подобный запрос составить?
Потестируйте такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT Событие, Max(Дата) AS ПоследняяДата, 
       (Max(Дата)-Min(Дата))/(Count(*)-1) AS СредняяПериодичность, 
       Date()-ПоследняяДата AS ПрошлоДней
FROM Таблица1
WHERE (SELECT Sum(1) FROM Таблица1 As T 
       WHERE T.Событие=Таблица1.Событие And T.Дата>=Таблица1.Дата)<=N+1
GROUP BY Событие
HAVING Count(*)>1 And Date()-Max(Дата)>=(Max(Дата)-Min(Дата))/(Count(*)-1)


где N - требуемый параметр.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39195664
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-Практикант-,
Не работает, точнее работает но результат не правильный. Взял такие даты
Дата01.02.201610.01.201620.01.201601.03.201604.03.201608.03.201610.03.2016
Результат для N = :
1 - 6 дней средняя
2 - 4.5 дней
3 - 6.3333 дней
Было мнение что он считает и последнюю разницу до сегодня для средней, но вроде результаты не подходят под эту теорию)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39195667
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-Практикант-,
Ой, вторая и третья дата соответственно февраль
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39195672
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если N это количество интервалов, то должно получиться так:
1 - 2 дня (10.03 и 08.03)
2 - 3 дня (10.03 08.03 04.03)
Если количество дат:
то для 1 не посчитает
для 2 - 2 дня
для 3 - 3 дня
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39195854
Здесь 18947278 Вы спрашивали
iddqd_win... как реализовать расчет периодичности рС не для всех событий а для 1, 2, n последних?
Я расшифровал это так: нужно определить рС по N последним (при сортировке в порядке возрастанию дат) записям каждого события. Для того, чтобы было более понятнее, вспомните, что каждой записи соответствует значение рТ и что запись с пустым рТ в расчетах не участвует.
Результаты запроса совпадают с
iddqd_winЕсли N это количество интервалов, то должно получиться так:
1 - 2 дня (10.03 и 08.03)
2 - 3 дня (10.03 08.03 04.03)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39195912
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-Практикант-Здесь Вы спрашивали
Я расшифровал это так: нужно определить рС по N последним (при сортировке в порядке возрастанию дат) записям каждого события.
Всё верно. рС средний интервал времени для N интервалов
Для того, чтобы было более понятнее, вспомните, что каждой записи соответствует значение рТ и что запись с пустым рТ в расчетах не участвует.
Тоже верно. рТ разница между двумя последующими датами одного события.
Результаты запроса совпадают с
iddqd_winЕсли N это количество интервалов, то должно получиться так:
1 - 2 дня (10.03 и 08.03)
2 - 3 дня (10.03 08.03 04.03)
Вы получили значения 2 дня для последнего интервала и 3 дня для 2 последних? Что же я делаю не правильно?(((
У меня все равно 4.5 и 6.33 для N равного 2 и 3 соответственно.
Давайте разберём код чтобы понять, почему у меня ошибка?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT Событие, Max(Дата) AS ПоследняяДата,  ' последняя дата для события
       (Max(Дата)-Min(Дата))/(Count(*)-1) AS СредняяПериодичность, ' разницу первой и последней даты делим на количество дат
       Date()-ПоследняяДата AS ПрошлоДней ' прошло дней с последней
FROM Таблица1
WHERE (SELECT Sum(1) FROM Таблица1 As T ' сумма чего-то?
       WHERE T.Событие=Таблица1.Событие And T.Дата>=Таблица1.Дата)<=N+1 условие для этой суммы?
GROUP BY Событие 
HAVING Count(*)>1 And Date()-Max(Дата)>=(Max(Дата)-Min(Дата))/(Count(*)-1) ' выбираем что показывать
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 2 из 3
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VB2010е, Access, Запрос к БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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