Как я могу рассчитать среднее значение между 20-м и 80-м процентилем? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть следующий SQL-запрос в Google BigQuery:

SELECT
  sensor,
  date,
  time,
  perc,
  PERCENTILE_CONT(perc,
    0.2) OVER(PARTITION BY sensor, date) AS percentile20_day,
  PERCENTILE_CONT(perc,
    0.8) OVER(PARTITION BY sensor, date) AS percentile80_day
FROM
  sensordata
ORDER BY
  Sensor,
  date,
  time

Теперь еще один дополнительный расчет, который я хочу добавить, - это среднее значение между двумя процентилями.В этом конкретном случае среднее значение всех значений между 20-м и 80-м процентилем за весь день.Хотя я не хочу ограничиваться днем ​​и, возможно, изменить его на временное окно (например, добавив еще один раздел).

До сих пор я не смог этого сделать.Я не понимаю, как я мог бы добавить это.

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Вам необходимо использовать подзапрос:

SELECT sensor, date, time, perc, percentile20_day, percentile80_day,
       AVG(CASE WHEN perc >= percentile20_day AND perc <= percentile90_day THEN perc END) OVER () as avg_20_80,
FROM (SELECT sd.*
            PERCENTILE_CONT(perc, 0.2) OVER (PARTITION BY sensor, date) AS percentile20_day,
            PERCENTILE_CONT(perc, 0.8) OVER (PARTITION BY sensor, date) AS percentile80_day
      FROM sensordata sd
     ) sd
ORDER BY Sensor, date, time;
0 голосов
/ 08 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT sensor, `date`, AVG(perc) avg_percentile20_80_day
FROM (
  SELECT sensor, `date`, perc,
    PERCENTILE_CONT(perc, 0.2) OVER(PARTITION BY sensor, `date`) percentile20_day,
    PERCENTILE_CONT(perc, 0.8) OVER(PARTITION BY sensor, `date`) percentile80_day
  FROM `project.dataset.sensordata`
)
WHERE perc BETWEEN percentile20_day AND percentile80_day
GROUP BY sensor, `date`
0 голосов
/ 07 февраля 2019

Попробуйте:

SELECT date, AVG(CASE
    WHEN sensor < PERCENTILE_CONT(perc, 0.2) OVER(PARTITION BY sensor, date) THEN NULL
    WHEN sensor > PERCENTILE_CONT(perc, 0.8) OVER(PARTITION BY sensor, date) THEN NULL
    ELSE sensor
    ) AS AvgSensorBTW20thAnd80thPercentile
FROM sensordata
GROUP BY date

Примечание: не тестировалось!

Согласно документации MSDN Функция AVG игнорирует NULL с.

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