powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VB2010е, Access, Запрос к БД
54 сообщений из 54, показаны все 3 страниц
VB2010е, Access, Запрос к БД
    #39187129
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица Таблица1:
Событие Дата рТ рССобытие1 01.01.2016 "" ""Событие1 05.01.2016 4 4Событие2 06.01.2016 "" ""Событие1 07.01.2016 2 3
Где рТ - Текущая разница с последней датой для данного события, дней
рС - средняя разница по всем рТ не равным ""(необязательное условие, можно и ноль добавить, правда среднее для второго события сократится вдвое, но на дистанции выравняется) для данного события, дней

При добавлении новой записи, нужно посчитать разницу с последней(наибольшей) датой для данного события - записать полученное значение в рТ и посчитать среднее для всех рТ по добавляемому событию и записать значение в рС.
Подскажите где ошибка?:
Код: vbnet
1.
SqlCom = New OleDbCommand("INSERT into Таблица1(Событие, Дата, рТ, рС) values('" & TextBox1.Text & "', '" & DateTimePicker1.Value.Date & "', '" & DateDiff("d", Max(Дата), Date()) &"', '" & Avg(рТ) & "' WHERE Событие = '" & TextBox1.Text & "'", Con)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187181
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Небольшое уточнение:
Событие - текстовый, Дата - Дата\Время, рС и рТ - Числовые. Двойными кавычками я пытался изобразить пустое поле) но можно заменить нулем.
Работа программы будет выглядеть следующим образом. На форме есть поля для добавления записей. Программа при старте должна делать прогноз - то есть, по прошествии с события дней больше чем рС, делать уведомление.
Если не делать запись значений рС, рТ в бд, то должно получится что-то типо такого:
Код: vbnet
1.
"Select * from Таблица1 where DateDiff(с последнего) > DateDiff(среднее)"


Сложность, для меня, в задании параметров для DateDiff.
Буду рад любой помощи.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187182
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,
Вычисления в таблицах - неправильно. рТ и рС-есть излишествующие данные
Вычисления проводятся в запросах (с параметрами-в данном случае, [введите дату] на которую хотите получить данные, это параметр)
как-то так:
Код: vbnet
1.
2.
3.
4.
PARAMETERS[введите дату] DateTime;
SELECT Таблица1.событие, DCount("событие","таблица1","дата<=#" & Format([введите дату],"mm\/dd\/yyyy") & "# and событие='" & [событие] & "'") AS Выражение1
FROM Таблица1
GROUP BY Таблица1.событие;
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187189
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
SELECT Таблица1.*, DateDiff("d", Таблица1.Дата, Date()) AS DD, Q.AvgAvg
FROM Таблица1 INNER JOIN 
(SELECT PDKey, Avg(DateDiff("d", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Таблица1.Событие) AS Q 
ON Таблица1.Событие = Q.Событие
WHERE (((DateDiff("d", Таблица1.Дата, Date())) > Q.AvgAvg));
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187196
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_winпо всем рТ не равным ""В результате чего рТ = "" ?
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187199
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
При добавлении в таблицу рТ будет равняться 0 дней. Не хотел ставить 0 потому что при второй дате, скажем с интервалом 10 дней, среднее значение будет равно 5, хотя по факту 10.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187202
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,

А, не учла "разница с последней датой для данного события", брала с текущей датой.
Вместо Date() в запросе нужно ввести определение этой последней даты.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187255
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelleiddqd_win,

А, не учла "разница с последней датой для данного события", брала с текущей датой.
Вместо Date() в запросе нужно ввести определение этой последней даты.

В какой строке? И давайте пройдемся вместе по коду, чтобы я не тупо переписал, а понял что к чему) код в вб уже:

Код: vbnet
1.
2.
3.
4.
5.
SqlCom = New OleDbCommand("SELECT Таблица1.*(нужно заменить на "Select * from Таблица1" или нет?), DateDiff(""d"", Дата, Date()) AS DD, Q.AvgAvg" _ ' здесь задается переменная Q.AvgAvg и высчитываем текущую разницу(рТ)?
                                  & "FROM Таблица1 INNER JOIN" _ ' Объединение запросов
                                  & ("SELECT PDKey, Avg(DateDiff(""d"", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q" _ ' Вот здесь начинается то что вызывает главные трудности) Для начала так понимаю Date() надо изменить здесь?(на что? Как обозначить следующую дату?) В этой строке считаем средний datediff для прошедших событий? Для чего PDKey нужен и сортировка? Всему этому присваиваем значение Q?  
                                  & "ON Событие = Q.Событие" _ 
                                  & "WHERE (((DateDiff(""d"", Дата, Date())) > Q.AvgAvg))", Con) ' Сравнивает два запроса и выводит строки подпадающие под условие?



Заранее спасибо.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187261
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если в такой форме, выдает ошибку:
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SqlCom = New OleDbCommand("SELECT Таблица1.*, DateDiff(""d"", Дата, Date()) AS DD, Q.AvgAvg" _
                                & "FROM Таблица1 INNER JOIN" _
                                & "SELECT PDKey, Avg(DateDiff(""d"", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q" _
                                & "ON Таблица1.Событие = Q.Событие" _
                                & "WHERE DateDiff(""d"", Дата, Date()) > Q.AvgAvg", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        DA = New OleDbDataAdapter(SqlCom)
        DA.Fill(DT)
        Grid.DataSource = DT
        Con.Close()
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187265
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_winОшибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
Во всех строках не хватает пробелов между частями выражения. И они сливаются в непонятное для компилятора запросов. Поставьте пробелы в конце или начале строк.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187266
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробелы забыл) Теперь так: Ошибка синтаксиса в предложении FROM
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187271
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win__Michelleiddqd_win,

А, не учла "разница с последней датой для данного события", брала с текущей датой.
Вместо Date() в запросе нужно ввести определение этой последней даты.
В какой строке?Простите, отвлекли.)))
Сейчас попробую показать...
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187279
iddqd_winЕсли в такой форме, выдает ошибку:
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Q.AvgAvgFROM Таблица1 INNER JOINSELECT PDKey'.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SqlCom = New OleDbCommand("SELECT Таблица1.*, DateDiff(""d"", Дата, Date()) AS DD, Q.AvgAvg" _
                                & "FROM Таблица1 INNER JOIN" _
                                & "SELECT PDKey, Avg(DateDiff(""d"", Дата, Date())) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q" _
                                & "ON Таблица1.Событие = Q.Событие" _
                                & "WHERE DateDiff(""d"", Дата, Date()) > Q.AvgAvg", Con)
        Con.Open()
        SqlCom.ExecuteNonQuery()
        DA = New OleDbDataAdapter(SqlCom)
        DA.Fill(DT)
        Grid.DataSource = DT
        Con.Close()

перед SELECT PDKey скобки не хватает
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187280
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT T.*, 
DateDiff("d", T.Дата, (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)) AS DD, 
Q.AvgAvg
FROM Таблица1 AS T INNER JOIN 
(SELECT Событие, Avg(DateDiff("d", Дата, (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC))) AS AvgAvg FROM Таблица1 GROUP BY Событие) AS Q 
ON T.Событие = Q.Событие
WHERE (((DateDiff("d", T.Дата, (SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC))) > Q.AvgAvg));

Ну вот, наскоро, надеюсь, без ошибок.
Здесь буква "T" - алиасное имя таблицы Таблица1 - латинская.
Попробуйте выполнить как запрос из окна БД.
Если результат будет похож на ожидаемый, тогда посмотрим, что дальше.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187302
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Если выполнять запрос в Access то просит ввести T.Событие. Если ввожу Событие1 то выводит следующее
Событие Дата DD AvgAvgСобытие1 27.02.2016 6 4Событие1 25.02.2016 8 4Событие2 27.02.2016 6 4Событие2 23.02.2016 10 4

Исходная таблица выглядит так

Событие Дата Событие1 25.02.2016 Событие1 27.02.2016 Событие1 29.02.2016 Событие1 02.03.2016 Событие1 04.03.2016 Событие2 23.02.2016 Событие2 27.02.2016 Событие2 03.03.2016 Событие2 06.03.2016

То есть что то не так) Да и ввод Т.События меня настораживает)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187312
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,

Да, не должно ничего требовать.
Вот, попробуйте, пожалуйста.
Код: sql
1.
2.
3.
4.
5.
SELECT T.*, DateDiff("d",T.Дата,(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)) AS DD, Q.AvgAvg
FROM Таблица1 AS T INNER JOIN (SELECT Событие, Avg(DateDiff("d",Дата,(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC))) AS AvgAvg
FROM Таблица1 AS T
GROUP BY Событие) AS Q ON T.Событие = Q.Событие
WHERE (((DateDiff("d",T.[Дата],(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)))>Q.[AvgAvg]));
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187411
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Ни чего вводить не просит)
Событие Дата DD AvgAvgСобытие1 27.02.2016 6 4Событие1 25.02.2016 8 4Событие2 27.02.2016 8 575Событие2 23.02.2016 12 575
Но не то) Здесь DD взято от максимального события, а не от сегодня - это я подправил.
Событие Дата DD AvgAvgСобытие1 02.03.2016 6 4Событие1 29.02.2016 8 4Событие1 27.02.2016 10 4Событие1 25.02.2016 12 4Событие2 27.02.2016 10 575Событие2 23.02.2016 14 575
А вот средняя не правильно считается. Как я понимаю, тут главное правильно составить алгоритм определения предыдущей даты?
Что-то типа дата для события1 которая меньше даты события1 искомой и если их несколько то максимальная из дат и все это загнать сначала в DateDiff а потом в Avg. И нужно еще исключить повторения, то есть надо вывести максимальное для события попадающего под условия.
Заранее спасибо за оказанную помощь.
Ну и пользуясь случаем, с 8 марта Вас!)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187458
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iddqd_win,

Спасибо за поздравление! Очень приятно!

Все-таки, "рТ - Текущая разница с последней датой для данного события" ( 18905198 ), или "с сегодняшней датой" ( 18907641 )?
Если "с сегодняшней датой", то вот результат в табличке, подходит?
Пока для наглядности выводятся все строки и добавлен столбец Res.Событие Дата DD AvgAvg ResСобытие1 25.02.2016 12 8 >Событие1 27.02.201610 8 >Событие1 29.02.2016 8 8 =Событие1 02.03.2016 6 8 <Событие1 04.03.2016 4 8 <Событие2 23.02.2016 14 7.75 >Событие2 27.02.2016 10 7.75 >Событие2 03.03.2016 5 7.75 <Событие2 06.03.2016 2 7.75 <
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187787
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,

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

То есть, "последняя дата" это не "максимальная для события", а "предыдущая относительно данной даты события"?
Тогда вариант:
Запрос 1. Определяем интервалы между датами события.
Код: sql
1.
2.
3.
4.
SELECT Событие, Дата, 
Avg(DateDiff("d",(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие AND Дата<T.Дата ORDER BY Дата DESC),Дата)) AS DD
FROM Таблица1 AS T
GROUP BY Событие, Дата;

РезультатСобытие Дата DDСобытие1 25.02.2016 Событие1 27.02.2016 2Событие1 29.02.2016 2Событие1 02.03.2016 2Событие1 04.03.2016 2Событие2 23.02.2016 Событие2 27.02.2016 4Событие2 03.03.2016 5Событие2 06.03.2016 3Запрос 2. Определяем среднее значение интервала для каждого события.
Код: sql
1.
2.
3.
SELECT Событие, Avg(DD) AS AvgAvg
FROM Запрос1
GROUP BY Событие;

РезультатСобытие AvgAvgСобытие1 2Событие2 4Запрос 3. Искомый результат. Выбираем записи с интервалами выше среднего для события.
Код: sql
1.
2.
3.
SELECT Запрос1.*, Запрос2.AvgAvg
FROM Запрос1 INNER JOIN Запрос2 ON Запрос1.Событие = Запрос2.Событие
WHERE Запрос1.DD > Запрос2.AvgAvg;

РезультатСобытие Дата DD AvgAvgСобытие2 03.03.2016 5 4
Ну как, подходит?)))
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187936
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Идеально) Огромное Вам спасибо!!!
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39187985
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
))).
Оказалось, самое трудное - правильно понять (или сформулировать?) задачу.)))
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188604
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,
Поторопился маленько)) Забыли самое главное)) ввел еще один запрос(рТН) для определения DateDiff с события до сегодня
Код: plsql
1.
2.
3.
SELECT T.Событие, T.Дата, DateDiff("d",T.Дата,(SELECT TOP 1 Дата FROM Таблица1 WHERE Событие=T.Событие ORDER BY Дата DESC)) AS Текущая
FROM Таблица1 AS T
GROUP BY T.Событие, T.Дата;


И теперь последний запрос
Код: plsql
1.
2.
3.
SELECT рТН.*, рС.Средняя
FROM рТН INNER JOIN рС ON рТН.Событие=рС.Событие
WHERE рТН.Текущая>рС.Средняя;


И теперь не могу сгруппировать чтобы только самое последнее отображалось
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39188609
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Michelle,

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

Правильно ли я понимаю, что требуется что-то вроде прогноза - каким был бы интервал, если событие произошло бы сегодня.
И средний интервал рассчитать с учетом полученного значения.
Так или нет?
...
Рейтинг: 0 / 0
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
VB2010е, Access, Запрос к БД
    #39195990
iddqd_winВы получили значения 2 дня для последнего интервала и 3 дня для 2 последних?
Да.
Кроме того - 3 для 3-х последних ЗАПИСЕЙ, 4.75 для 4-х, 5.8 для 5-и, 6.33 для 6-и.
Предпочитаю говорить о записях, а не неизвестно о каких интервалах.
Выкладываю архив, в котором две базы: db1.mdb создана в Access2003, Database1.accdb - в Access2010 Portable. Запрос Запрос1 отрабатывает нормально.
iddqd_winЧто же я делаю не правильно?(((
Чтобы это понять необходима Ваша база.
Хотя, если задаете значение N в диалоговом окне, появляющемся при запуске запроса, то, на всякий случай, в запросе перед началом запроса (выше SELECT) поместите строку
Код: sql
1.
PARAMETERS N Long;


iddqd_winДавайте разберём код чтобы понять, почему у меня ошибка?
Подзапрос
Код: sql
1.
2.
SELECT Sum(1) FROM Таблица1  As T 
WHERE T.Событие=Таблица1.Событие And T.Дата>=Таблица1.Дата


для каждого события таблицы Таблица1 определяет номера записей, начиная с последней, (1-последняя, 2-предпоследняя, ...). Сравнение
Код: sql
1.
подзапрос<=N+1


фильтрует записи, номера которых не превышают N+1, и основной запрос работает только с отфильтрованными записями.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39196001
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-Практикант-,
Спасибо за объяснение)
И да
PARAMETERS N Long;

именно этого не хватало) Теперь работает.
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39196120
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-Практикант-,
Не получается этот запрос адаптировать для VB2010((
Если оставить так как есть ругается на - Отсутствует значение для одного или нескольких требуемых параметров.
Пробовал так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim N As Long
        N = 2
        SqlCom = New OleDbCommand("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);", Con)
        SqlCom.Parameters.AddWithValue("@N", N)


Работает но параметры не задает и получается 6.33
И по всякому с параметрами поигрался все равно 6.33
А что то типа такого сделать нельзя?)))
SqlCom = NewOleDbCommand("Таблица1.Запрос1", Con)
...
Рейтинг: 0 / 0
VB2010е, Access, Запрос к БД
    #39196308
iddqd_win
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-Практикант-,
Разобрался сам)
Правда теперь встал вопрос как обозначить N для всех событий. Ну да ладно просто сделаю код с условием if ... then)
Спасибо!
...
Рейтинг: 0 / 0
54 сообщений из 54, показаны все 3 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / VB2010е, Access, Запрос к БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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