Groupby получить имя средней длины

Я использую группу по функциям, чтобы получить некоторые товары из моего маленького магазина, такие как:

select name, ProductID from blog group by ProductID

+----------------------------------------------------------+
| name                                                     |
+----------------------------------------------------------+
| AAA                                                      |
| BBBB                                                     |
| CCCC                                                     |
| DDDDDDDD                                                 |
+----------------------------------------------------------+

Можно ли получить имя средней длины в функции groupby?

РЕДАКТИРОВАТЬ (из ОП, помещен в ответ):

myysql> select length(name) as len, name from product where article=40 order by len asc;
+------+----------------------------------------------------------+
| len  | name                                                     |
+------+----------------------------------------------------------+
|    3 | aaa                                                      |
|    6 | BBBBBB                                                   |
|    6 | CCCCCC                                                   |
|    8 | dddddddd                                                 |
+------+----------------------------------------------------------+
4 rows in set (0.00 sec)

в этом примере мне нужно получить одно значение, например BBBBBB или CCCCCC (AVG?)

3 ответа

Ваш пример не получает имя средней длины, потому что такого нет. Средняя длина будет (8 + 3 + 6 + 6) / 4 = 5,75. Не существует Я думаю, что вы хотите медиану, размер которой такой, что 50% больше, а 50% меньше.

Вот один из способов получить медиану (при условии, что имена не содержат запятых и что конкатенация не превышает определенные пределы):

select ProductID,
       substring_index(substring_index(group_concat(name order by length(name) separator '||'
                                                   ), '||', 1 + count(*)/2
                                      ), '||', -1) as MedianLengthName
from blog
group by ProductID;

Попробуйте этот запрос:

SELECT AVG(CHAR_LENGTH(name)) AS avg FROM tbl; 

Если вы ищете среднее значение (которое подразумевает, что вы должны будете принять целое число выше и ниже этого десятичного значения), вы можете использовать это:

SELECT *
FROM (
  SELECT AVG(CHAR_LENGTH(name)) AS average
  FROM product) AS calculated
JOIN product
  ON CHAR_LENGTH(name) BETWEEN FLOOR(average) AND CEILING(average);
Другие вопросы по тегам