【问题标题】:groupby get the average length namegroupby 获取平均长度名称
【发布时间】:2014-03-25 14:29:16
【问题描述】:

我正在使用按功能分组从我的小商店购买一些产品,例如:

select name, ProductID from blog group by ProductID

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

groupby函数中是否可以得到平均长度名称?

编辑(来自 OP,放在答案中):

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

【问题讨论】:

  • mysql 中字符串的长度为CHAR_LENGTH,因此在您的情况下为MAX(CHAR_LENGTH(name))/COUNT(DISTINCT(name)),但这在索引方面效率非常低。如果这是您需要的,您应该有一个单独的列,其中预先计算了长度。如果没有,您应该更好地阐明您需要什么。
  • 在你的例子中,答案是什么? 1 值为 4.75 ((3+4+4+8)/4)?或者对于每一行,名称的平均长度,因为每个 ProductID 有超过 1 个名称?
  • 通过这个例子,我需要 BBBB 或 CCCC 不是最小的长度,也不是最长的长度

标签: mysql group-by string-length


【解决方案1】:

您的示例没有得到平均长度名称,因为没有这样的东西。平均长度为 (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;

【讨论】:

  • 感谢 Gordon 的解决方案,是否可以将字符从“,”变为“||” ?谢谢
  • substring_index(group_concat(name order by length(Name) SEPARATOR '||'), '||', count(*)/2) as MedianLengthName - 这不起作用:(
  • 这不只是列出了一半的名字——那些长度最小的名字吗?例如,如果 GROUP_CONCAT 返回 1,22,333,4444,55555,它不会返回 '1,22' 但中位数是 333?
  • 对,我已经测试过了:/还有其他解决方案吗?分隔符应该是 ||.. 这也不行。/
  • @AgRizzo 。 . .我想我解决了这两个问题。一个只是一个“一个接一个”的错误。第二个更愚蠢。 . .省略第二个 substring_index() 以获得最后一个值。
【解决方案2】:

试试这个查询:

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

【讨论】:

    【解决方案3】:

    如果您正在寻找平均值(这意味着您必须接受该十进制值上方和下方的整数),您可以使用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多