![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
	 | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Доброе время суток. Задача вообщем то простая, но я запутался в лабиринтах 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)
  | ||