Вычисление медианы в SQL никогда не казалось простым. Некоторые механизмы SQL даже не имеют прямой медианной функции. Как правило, вы запускаете функцию для необработанных данных, чтобы вы хотя бы знали, как выглядят агрегированные данные.
Однако давайте добавим кривую. Что делать, если все данные уже были агрегированы, и у вас не было доступа к необработанным данным. Вместо этого у вас была только таблица высокого уровня.
Например, предположим, что данные выглядели так, как показано ниже.

Может показаться странным, что данные хранятся таким образом, но бывают случаи, когда такое сжатие данных может иметь смысл. Допустим, ваша команда хранит миллиарды транзакций в день, и вы хотите выполнить расчет медианы за несколько лет.

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

Может возникнуть соблазн, так сказать, «развернуть» данные. Чтобы взять данные и создать новую таблицу, в которой есть строка для каждого из экземпляров человека в определенном возрасте. Это может привести к значительному увеличению ваших строк, до терабайт за терабайтами. Кроме того, это еще один шаг, который, возможно, не нужно делать.

Вместо этого давайте посмотрим на этот запрос.

SELECT TOP(1) Age
FROM  (
   SELECT Age,
    SUM(Total) OVER (ORDER BY Age) AS runsum,
    SUM(Total) OVER () AS total
   FROM    Age_Exp
  ) AS d
WHERE  runsum >= total / 2
ORDER BY Age;

Этот запрос короткий и приятный, и вы также заметите, что он дает промежуточную сумму, которую мы обсуждали недавно (видео). Цель среды - найти число на полпути ко всем данным. Это означает, что вам нужно знать общую сумму и найти ее на полпути.

Это работает следующим образом: используя скользящую сумму, вы можете выяснить, где окажется середина пути, потому что промежуточная сумма будет суммировать общее значение.

Затем, используя другую аналитическую функцию, которая получает сумму, вы можете разделить ее пополам и выбрать только верхнее значение. Медиана будет наивысшим значением.

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