Как получить медиану для временного интервала в Postgres?

Учти это:

SELECT
  review.clicker_id,
  sum(review.done - review.due) as timespent,
  PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY timespent ASC) as median
FROM review WHERE monologue_id=7142 GROUP BY clicker_id ORDER BY timespent ASC;

Я пытаюсь получить медианное значение для sum(review.done - review.due) (интервала времени). Но, очевидно, мне не разрешено делать это таким образом:

Ошибка в запросе: ОШИБКА: столбец "timespent" не существует LINE 4:
PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY time ASC) as m...

Как я должен это сделать?


person Fabien Snauwaert    schedule 17.01.2020    source источник
comment
См. stackoverflow.com/questions/11785622/. Кроме того, вызов столбца time, вероятно, не лучшая идея, поскольку это тип данных.   -  person wobr    schedule 17.01.2020
comment
Отвечает ли это на ваш вопрос? Как использовать ALIAS в PostgreSQL ORDER BY пункт?   -  person wobr    schedule 17.01.2020
comment
Переименовал time в timespent, чтобы избежать путаницы. Но это не проблема здесь.   -  person Fabien Snauwaert    schedule 17.01.2020
comment
Нет, проблема в заказе по псевдониму, ответ на который дан в связанном вопросе, но переименование — это хорошо.   -  person wobr    schedule 17.01.2020
comment
@FabienSnauwaert, не могли бы вы также добавить несколько образцов данных и точный ожидаемый результат?   -  person Jim Jones    schedule 17.01.2020
comment
Может быть, это? SELECT review.clicker_id, sum(review.done - review.due) as timespent, PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY sum(review.done - review.due) ASC) as median FROM review WHERE monologue_id=7142 GROUP BY clicker_id ORDER BY timespent ASC;   -  person Jim Jones    schedule 17.01.2020
comment
@wobr Извините, но я все еще не понимаю, как это отвечает на вопрос. (Псевдоним в самом внешнем запросе и так работает нормально; замена его на GROUP BY 1 ORDER BY 2 ASC будет работать так же, но в этом нет необходимости.) Теперь, если я попытаюсь заменить псевдоним внутри GROUP(ORDER BY timespent ASC) номером столбца (2), все, что я получу для этот столбец представляет собой набор двоек, а не ожидаемую медиану.   -  person Fabien Snauwaert    schedule 17.01.2020
comment
@JimJones приводит к ОШИБКЕ: вызовы агрегатных функций не могут быть вложены. Буду редактировать, чтобы добавить подробности, спасибо.   -  person Fabien Snauwaert    schedule 17.01.2020
comment
@FabienSnauwaert Ясно .. трудно проверить без данных: D Может быть, CTE? WITH j AS ( SELECT review.clicker_id, sum(review.done - review.due) as timespent FROM review WHERE monologue_id=7142 ) SELECT clicker_id,timespent, PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY timespent ASC) as median FROM j WHERE GROUP BY clicker_id ORDER BY timespent ASC   -  person Jim Jones    schedule 17.01.2020
comment
Поиграл с фиктивными данными, это то, что вам нужно: WITH totals AS (SELECT clicker_id,review.done - review.due AS timespent FROM review WHERE monologue_id = 7142) SELECT clicker_id,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY timespent ASC) AS median FROM totals GROUP BY 1;   -  person wobr    schedule 17.01.2020