Я хочу, чтобы вычислить Median из y
в подгруппах этого простого xy_table
:SQL ранжирования запроса для вычисления рангов и медианы в подгруппах
x | y --groups--> gid | x | y --medians--> gid | x | y
------- ------------- -------------
0.1 | 4 0.0 | 0.1 | 4 0.0 | 0.1 | 4
0.2 | 3 0.0 | 0.2 | 3 | |
0.7 | 5 1.0 | 0.7 | 5 1.0 | 0.7 | 5
1.5 | 1 2.0 | 1.5 | 1 | |
1.9 | 6 2.0 | 1.9 | 6 | |
2.1 | 5 2.0 | 2.1 | 5 2.0 | 2.1 | 5
2.7 | 1 3.0 | 2.7 | 1 3.0 | 2.7 | 1
В этом примере каждый x
уникален и таблица уже отсортирована по x
. Теперь я хочу GROUP BY round(x)
и получить кортеж, который содержит медиану y
в каждой группе.
я уже могу вычислить медиану для всей таблицы с этим ранжирования запроса:
SELECT a.x, a.y FROM xy_table a,xy_table b
WHERE a.y >= b.y
GROUP BY a.x, a.y
HAVING count(*) = (SELECT round((count(*)+1)/2) FROM xy_table)
Выход: 0.1, 4.0
Но я еще не удается писать запрос для вычисления медианы для суб групп.
Внимание: У меня нет функции агрегации median()
. Также не предлагайте решения со специальными PARTITION
, RANK
или QUANTILE
заявлениями (как указано в аналогичных, но также и с конкретными поставщиками SO questions). Мне нужен простой SQL (то есть, совместимый с SQLite без median()
функции)
Edit: Я был на самом деле ищу Medoid и не Median.
Какова связь между 2-й и 3-й таблицами в вашем примере? 1-й «gid» изменен на 0.1, а значения 'x' или' y' не являются медианами для группы 0 – Aprillion
Извините, у меня была опечатка. Третья таблица должна содержать медианы групп 'gid' (группы ID). И я полагаю, что медиана [4,3] равна 4 (большее значение) в таких случаях. – Juve
медиана [4,3] обычно равна 3,5, как указано в первом абзаце вашей ссылки на Википедию, вы явно хотите получить большую ценность? – Aprillion