Объединить значения из столбцов без группировки строк SQL - PullRequest
0 голосов
/ 04 мая 2020

У меня есть следующая таблица:

clientId | value | date |
1        |      2| Jan 1|
1        |      3| Jan 2|
1        |      4| Jan 5|
2        |      1| Jan 1|
2        |      2| Jan 2|
2        |      7| Jan 6|

Я хочу удалить строки, где значение ниже 25-го процентиля всех значений для каждого клиента и выше 75-го процентиля. Затем я хочу усреднить значения, которые остаются. Моя идея состояла в том, чтобы объединить строки значений вместе в порядке возрастания, а затем использовать SUBSTRING_INDEX для удаления значений выше или ниже пороговых значений, рассчитанных с использованием COUNT (*):

SUBSTRING_INDEX(SUBSTRING_INDEX(
GROUP_CONCAT(`transactionCount` ORDER BY
`transactionCount` SEPARATOR ','), ',', -(75 / 100 * COUNT(*))),
',', ROUND(75 / 100 * COUNT(*) -1)) AS sub2

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

  1. Есть ли способ усреднить значения в строке в том же запросе sql?

  2. Является ли это совершенно ненужным способом избавления от значений ниже 25-го и выше 75-го процентиля всех значений? Есть ли способ сделать это лучше? Я предполагаю, что должен быть способ установить предложение HAVING, которое может вычислять процентили и удалять значения ниже или выше их, верно? Что-то вроде: HAVING value> = 25thPercentileOfValues ​​AND value <= 75thPercentileOfValues. Но как бы я измерил эти два значения: (</p>

Любая помощь будет принята с благодарностью, спасибо, ребята: D

1 Ответ

0 голосов
/ 04 мая 2020

Вероятно, самый простой метод - ntile(), фильтр, а затем агрегирование:

select clientid, avg(value)
from (select t.*, ntile(4) over (partition by clientid order by value) as tile
      from t
     ) t
where tile in (2, 3)
group by clientid;
...