|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Потерялся в наборе данных DataSet
Доброе время суток. Задача вообщем то простая, но я запутался в лабиринтах if, else и все это в цикле while.
Не могу придумать правильный алгоритм... В общем есть DataSet с набором вот таких данных. см. вложение введите сюда описание изображения Нужно получить из них разность СКО1 СМЕЖНЫХ дат, по которой я строю график. Например если я нахожусь на строке 15.11.2017 то это будет 0,039-0,026. Вопросов бы не возникало бы, если при одинаковых датах не нужно было складывать СКО1 с СКО3 и с суммы обратно получать разность, например когда находишься на дате 01.12.2017, то это будет 0,005+0,016-0,010. Я просто теряюсь в какой переменной у меня уменьшаемое, а в каком вычитаемое… и заносятся они все время в разные переменные, нужно ставить дополнительные флаги... это просто ппп… Алгоритм как бы не очень ясен Я уже не знаю, может нужно организовать дополнительный массив уменьшаемых, и вычитаемых, и когда они сформируются (значения при одинаковых датах) тогда только вычислять разность. Разности конечно для каждых ID свои. Заранее спасибо за ответ. Последний раз редактировалось Konstantin-78, 14.12.2017 в 02:19. |
#2
|
||||
|
||||
Задача не ясна. Опишите её корректнее.
Цитата:
|
#3
|
|||
|
|||
Цитата:
смотрите, как показано в таблице, есть СКО1 и СКО3, которые привязаны к датам. Даты идут по возрастанию. Мне нужно получить разность чисел в поле СКО1, если даты различаются друг от друга на 1 день не более. Итак первое значение 0,026 относится к 12.11.17 второе значение 0,039 относится к 13.11.17 разнось между этими датами 1 день, значит 0,039-0,026. т.к. 14.11.17 - нет, то мы пропускаем.. потом надо найти разность СКО между 15.11.17 и 16.11.17 (разность 1 день) и т.д. это пока просто ... вопросы появились если есть например дата 01.12.17, к которой привязаны два числа 0,016 и 0,005 (СКО1 и СКО3), если 2 числа привязаны к одной дате, то мы их суммируем и потом отнимаем число за 30.11.17 0,010 После этой даты начинаем отсчет заново, т.к. СКО "обнуляется" (и брать разность между 02.12.17 и 01.12.17 не имеет смысла). Эти разности будут отображаться на графике, таким образом будет видно "мощность" на каждый день. Последний раз редактировалось Konstantin-78, 14.12.2017 в 03:01. |
#4
|
|||
|
|||
1. Можно сразу подготовить DataSet. Группируем по датам и сразу складываем твои СКО:
Код:
select DATE_CONTROL, SUM(COALESCE(CKO1,0) + COALESCE(CKO3,0)) as VALUE GROUP BY DATE_CONTROL ORDER BY DATE_CONTROL 2. Ну а теперь простым циклом перебираем записи и высчитываем разницу: Код:
var Prev : Double; begin Prev := 0; DataSet.First; While Not DataSet.EOF Do begin AddPoint(DataSet.FieldByName('DATE_CONTROL').AsDateTime,DataSet.FieldByName('Value').AsFloat - Prev); Prev := DataSet.FieldByName('Value').AsFloat; DataSet.Next; end; PS. Можно все вычислить прямо в запросе, через оконные функции, но это для БД тяжелее, а потом все-равно "бежать" по датасету, так что смысла особого нет. |
#5
|
|||
|
|||
Цитата:
Задумка хорошая, но запрос почемуто не суммирует СКО у одинаковых дат, а просто значения СКО выводит в один столбец. и "VALUE" к томуже зарезервированное слово, изменил на "VALUE1" Последний раз редактировалось Konstantin-78, 14.12.2017 в 13:24. |
#6
|
|||
|
|||
А-а-а... я не внимательно посмотрел. Для DATE_CONTROL надо отрезать время. Посмотри как получить чистую дату в твоей БД (ты ж не написал какая). Нпример, для MS Access будет выглядеть примерно так:
Код:
select DateValue(DATE_CONTROL), SUM(COALESCE(CKO1,0) + COALESCE(CKO3,0)) as VALUE GROUP BY DATE_CONTROL ORDER BY DateValue(DATE_CONTROL) |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Konstantin-78 (15.12.2017)
|