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);