Расчет агрегации для всех позиций с переносом данных из некоторых предыдущих точек данных - PullRequest
0 голосов
/ 29 мая 2018

Как выполнить вычисления агрегации при переходе данных из предыдущих точек данных?

Например, у меня есть таблица для оценки значения свойства.Каждая точка данных предназначена только для свойства.

"Property Value Evaluation"

Date        Property   Value
1/5/2017    A          10
2/3/2017    B          8
2/20/2017   B          12
3/1/2017    A          9
4/10/2017   B          15

И при условии, что значение свойства остается таким же, как оно было оценено в прошлый раз, до тех пор, пока оно не будет оценено снова.Например, значение свойства А было 10 на 1/5, и оно оставалось 10 до 3/1, пока оно не было переоценено как 9.

Как получить отчет, показывающий трендзначения всех свойств?То есть мне нужно включить все свойства в каждую точку данных отчета, например:

"Value Trend of All Properties"

Date        Total   Average
1/5/2017    10      10
2/3/2017    18      9
2/20/2017   22      11
3/1/2017    21      10.5
4/10/2017   24      12

(где Total - сумма значений свойства A и свойства B, а Average - это значениесреднее значение этих двух значений.)

Проблема, с которой я столкнулся, заключается в том, что для подзапроса, который принимает Date и Property в качестве параметров и возвращает последнее значение, возникает следующая ошибка, даже если мой подзапрос«select LAST_VALUE ([Value]) ...», который возвращает только 1 значение:

«Подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = или когда подзапрос используется в качестве выражения. "

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

попробуйте это:

SELECT [Date],
        Value+ISNULL(LAG(Value) OVER(order by (Select null) ),0) Total , 
        (Value+ISNULL(LAG(Value) OVER(order by (Select null) ),0))*1.0/2 As Average 
from Property_Evaluation
0 голосов
/ 02 июня 2018

Используя подсказки из ответов, опубликованных здесь другими, я построил полный оператор SQL, как показано ниже.

SELECT sq1.Date
   , sum(sq1.Value) Total
   , avg(sq1.Value) Average
from (
   select sq2.Date
      , sq2.Property
      , ISNULL(sq6.Value, (
         select sq3.Value 
         From (
            select sq6.Date
               , sq6.Property
               , isnull(sq6.Value, LAG(sq6.Value) OVER (partition by sq6.Property order by sq6.Date)) Value
            from (
               select isnull(sq4.Date, sq5.Date) Date
                  , isnull(sq4.Property, sq5.Property) Property
                  , sq4.Value Value
               from (
                  select distinct sq2.Date Date
                     , sq2.Property Property
                  from [PropertyEvaluation]
                  ) sq5
                  full outer join (
                     SELECT [Date] Date
                        , [Property] Property
                        , [Value] Value
                     FROM [PropertyEvaluation] 
                     where [Property] = sq2.Property) sq4
                  on sq5.Date = sq4.Date 
               ) sq6
            ) sq3
         where sq3.Date = sq2.Date
            and sq3.Property = sq2.Property
         )
     ) Value
   from (
      select sq7.Date Date
         , sq8.Property Property
      from (
         select distinct [Date] Date
         from [PropertyEvaluation]) sq7
         , (select distinct [Property] Property
         from [PropertyEvaluation]) sq8
      ) sq2
      left join (
         SELECT [Date] Date
            , [Property] Property
            , [Value] Value
         FROM [PropertyEvaluation] 
         ) sq6
      on sq2.Date = sq6.Date and sq2.Property = sq6.Property
   ) sq1
group by sq1.Date
order by 1

Он возвращает желаемые результаты:

Date        Total   Average
1/5/2017    10      10
2/3/2017    18      9
2/20/2017   22      11
3/1/2017    21      10.5
4/10/2017   24      12
0 голосов
/ 29 мая 2018

Вы можете использовать оконные функции:

select date, sum(val),
       avg(sum(val) * 1.0) over (order by date) as average
from t
group by date
order by date;

Вы можете использовать оконные функции в сочетании с функциями агрегирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...