powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / вычисление между строками
20 сообщений из 20, страница 1 из 1
вычисление между строками
    #38130248
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день всем.
подскажите плз можно ли решить данную проблему:
имеем:
присоединенная(через odbc) таблица из sql,
поля:
tag(int), date(int)
tag при присоединении назначается ключевым полем
tag имеет неколько фиксированных значений, date меняется, табличка дописывается каждый час,
нужно:
вычислить и вывести цифру data(запись) - data(предыдущая запись)
т.е типа почасовая выработка за сутки
уже все мозги сломал как это реализовать..
...
Рейтинг: 0 / 0
вычисление между строками
    #38130276
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделайте это на стороне сервера нормальным t-sql'ем, а готовый результат уже подлинкуйте как "таблицу"
...
Рейтинг: 0 / 0
вычисление между строками
    #38130287
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
П-Л,
хм.. сорри а можно поподробнее(для немного бестолковых) как это сделать?
...
Рейтинг: 0 / 0
вычисление между строками
    #38130367
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Открываете серверную студию.
Пишете скрипт создания вью, делающего нужные вам вычисления.
Отлаживате и добиваетесь его правильной работы.
Готовый вью линкуете к базе аксеса.
...
Рейтинг: 0 / 0
вычисление между строками
    #38130398
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
П-Л,

к сожалению этого не смогу, а на стороне акцесса это как нибудь все таки можно сделать?
...
Рейтинг: 0 / 0
вычисление между строками
    #38130453
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chester1310,

елай что говорят. Это не трудно. Создай запрос типа Pass-Trough подключи его через odbc к серверу и напиши примерно следующий текст:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select t1.tag, t1.date as StartDate, t2.date as EndDate, datediff(second, t1.date, t2.date) as diffdt
from (
	select row_number() over (partition by tag order by tag, date desc) as No,
		tag, date
	from tbl (nolock)) as t1
inner join (	select row_number() over (partition by tag order by tag, date desc) as No,
		tag, date
	from tbl (nolock)) as t2
on t1.tag = t2.tag
where t1.No + 1 = t2.No


Где tbl - имя твоей таблицы

Скрипт можно усовершенствовать, введя временную таблицу:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select row_number() over (partition by tag order by tag, date desc) as No,
	tag, date
into #t
from tbl (nolock)

select t1.tag, t1.date as StartDate, t2.date as EndDate, datediff(second, t1.date, t2.date) as diffdt
from #t as t1
inner join #t as t2
on t1.tag = t2.tag
where t1.No + 1 = t2.No



diffdt - выработка между двумя записями в секундах. Ее еще надо будет перевести в необходимый формат. Но, это уже техника

Возможны и другие варианты.
ЗЫ
По-видимому, здесь не хватает фильтров, так как запрос выведет все данные из таблицы.
Поскольку, примене inner join, последние записи для каждого tag не будут выводиться
...
Рейтинг: 0 / 0
вычисление между строками
    #38130464
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку.

В первом случае можно создать вью, как говорил П-Л , во втором, лучше создать процедуру. В первом случае можно с вью работать, как с таблицей, используя обычный линк к БД, во втором - тип запроса Pass-Trough.
В любом случае никаких проблем нет
...
Рейтинг: 0 / 0
вычисление между строками
    #38130590
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin Dmitrychester1310,

елай что говорят. Это не трудно. Создай запрос типа Pass-Trough подключи его через odbc к серверу и напиши примерно следующий текст:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select t1.tag, t1.date as StartDate, t2.date as EndDate, datediff(second, t1.date, t2.date) as diffdt
from (
	select row_number() over (partition by tag order by tag, date desc) as No,
		tag, date
	from tbl (nolock)) as t1
inner join (	select row_number() over (partition by tag order by tag, date desc) as No,
		tag, date
	from tbl (nolock)) as t2
on t1.tag = t2.tag
where t1.No + 1 = t2.No


Где tbl - имя твоей таблицы



это сделал, запросом в sql, работает, но выводит какие то непонятные цыфры, на секунды между записями непохоже...

tag| StartDate| EndDate| diffdt
185| 9408| 7584| -157593600

разница между этими записями сутки
...
Рейтинг: 0 / 0
вычисление между строками
    #38130594
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin DmitryВ догонку.

В первом случае можно создать вью, как говорил П-Л , во втором, лучше создать процедуру. В первом случае можно с вью работать, как с таблицей, используя обычный линк к БД, во втором - тип запроса Pass-Trough.
В любом случае никаких проблем нет

сорри, а можно немного поподробнее...
...
Рейтинг: 0 / 0
вычисление между строками
    #38130627
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tag StartDate EndDate diffdt185 9408 7584 -157593600

Что-то у тебя с датами 9408 = 05/10/1925, а 7584 = 07/10/1920

Что, собственно пояснять? Как создать вью или процедуру? Или, как потом прилинковаться к серверу и прилинковать этот вью и запустить процедуру? Что? И как объяснять? Не лучше ли порыться в учебниках? А, впрочем, спрашивай. Только, конкретно
...
Рейтинг: 0 / 0
вычисление между строками
    #38130670
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rivkin DmitryЧто, собственно пояснять? Как создать вью или процедуру? Или, как потом прилинковаться к серверу и прилинковать этот вью и запустить процедуру? Что? И как объяснять?
Можно короче - Ф1
...
Рейтинг: 0 / 0
вычисление между строками
    #38130995
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin Dmitrytag StartDate EndDate diffdt185 9408 7584 -157593600

Что-то у тебя с датами 9408 = 05/10/1925, а 7584 = 07/10/1920



наверное я плохо объяснил...
data(int) в нем просто числовые значения(показания датчиков, например весов), т.е есть отсчеты за 00, 01, 02....23 часы и нужно вычислить сколько прошло груза за час.

Rivkin DmitryЧто, собственно пояснять? Как создать вью или процедуру? Или, как потом прилинковаться к серверу и прилинковать этот вью и запустить процедуру? Что? И как объяснять? Не лучше ли порыться в учебниках? А, впрочем, спрашивай. Только, конкретно


вью это просто запрос?
несложные запросы, процедуры пишу, прилинковаться к серверу могу,
проблема с этим рассчетом...
...
Рейтинг: 0 / 0
вычисление между строками
    #38131016
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я сам не люблю просить все сделать за меня...
перед тем как спрашивать стараюсь почитать как что и попробовать сам, но к сожалению осваиваю это сам, и литература не всегда помогает, да и уже не 20 лет
так что за глуповатые вопросы не пинайте сильно плз ... :)
...
Рейтинг: 0 / 0
вычисление между строками
    #38131107
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если поле названо date, то хочется думать, что оно содержит в себе календарную дату (неважно в каком формате) Извините меня, что я еще мог подумать? Сразу же после обхяснения ТС возникает вопрос, а в каком поле лежат эти самые отсечки 00, 01, 02....23 и вкаом поле находится реальная календарная дата?
Короче, таблицу в студию. Если все правильно сделано, запрос можно будет еще больше упростить
...
Рейтинг: 0 / 0
вычисление между строками
    #38131138
П-Л
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Date - зарезервированное слово и в SQL и в VBA. Плохое название для поля.
...
Рейтинг: 0 / 0
вычисление между строками
    #38131142
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chester1310проблема с этим рассчетом...

Нет здесь проблемы. Идея очень простая. Обращаемся к таблице 2 раза - делаем 2 одинаковых запроса.
Запросы обязательно должны содержать ключевое поле (tag в нашем случае) и поле счетчика, вместо которого может выступать фиксированая дата (например 2013-01-30 08:00 и следующие за ней 2013-01-30 09:00б 2013-01-30 08:10 ...)
Эти 2 запроса нужно соеденить друг с другом так, чтобы совпадали ключевые поля, а поля счетчика отличались на еденицу (важно, чтобы не было прорусков!!! Если такое возможно, придется делать свое поле счетчика, как я сделал в примере)
И все
...
Рейтинг: 0 / 0
вычисление между строками
    #38131172
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin DmitryЕсли поле названо date, то хочется думать, что оно содержит в себе календарную дату (неважно в каком формате) Извините меня, что я еще мог подумать? Сразу же после обхяснения ТС возникает вопрос, а в каком поле лежат эти самые отсечки 00, 01, 02....23 и вкаом поле находится реальная календарная дата?
Короче, таблицу в студию. Если все правильно сделано, запрос можно будет еще больше упростить

согласен, date это и можно обозначить и дату и данные, к сожалению такая досталась таблица, я привык...

таблица:
tag[int]
date[int]
time[time(0)] default (sysdatetime())
sdt[smalldatetime] default (sysdatetime())

таблица заполняется процедурой по расписанию, каждый час, данные в первые 2 поля беруться из другой таблички, выбираются 6 тэгов (в основной таблице их около 600), т.е каждый час прибавляется 6 строк, в которых 2 поля проставляются автоматом
time и sdt используются как индикаторы времени записи и работы агента
...
Рейтинг: 0 / 0
вычисление между строками
    #38131227
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chester1310,

1. Что-то я не понимаю: Только 6 тэгов за час из 600 означает, что повторяться тэги начнут приблизительно через 4 суток 600/6=100 часов. О какой почасовой выработке может идти речь?

2. Одно из полей явно избыточно
time[time(0)] default (sysdatetime())
sdt[smalldatetime] default (sysdatetime())

3. Английское date - означает только календарную дату и ничего больше. Данные, называются data

4. Если речь идет не о почасовой выработке, а о выработке между двумя последовательными записями по времени для одного и того же тэга, тогда уточню код запроса:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select t1.tag, t1.date as StartDate, t2.date as EndDate, t2.date - t1.date as diffdt
from (
	select row_number() over (partition by tag order by tag, sdt desc) as No,
		tag, date
	from tbl (nolock)) as t1
inner join (	select row_number() over (partition by tag order by tag, sdt desc) as No,
		tag, date
	from tbl (nolock)) as t2
on t1.tag = t2.tag
where t1.No + 1 = t2.No
...
Рейтинг: 0 / 0
вычисление между строками
    #38131784
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin Dmitry,

запрос работает, сегодня-завтра погоняю, донастрою на текущую ситуацию, отпишу как что..
у меня к сожалению не хватает базовых знаний, чтобы такое написать..
подкрутить, прикрутить могу, а вот правильно составить такой уже нет...
...
Рейтинг: 0 / 0
вычисление между строками
    #38136037
chester1310
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rivkin Dmitry,

огромное спасибо!!!!!

все работает, кое что подкрутил под себя,
немного понял как это работает,

лишние поля я вводил для упрощения последующей обработки, еще подкрутил доп таблицы через которые происходят подсчеты, получилось супер!!
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / вычисление между строками
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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