问题是要计算表中分布的值的中位数。我在针对相同uid的表列中有多个值,在这里我需要找到每个uid的那些值的中位数。为了做到这一点,我首先将值连接起来,然后尝试针对每个uid在分组值中找到中位数。组连接后,我将值放入了逗号分隔的列表中。

现在,我需要从下表中“ text_responded_in_hour”列中给出的逗号分隔值中找到中位数。

uId |text_responded_in_hour
----|-----------------------
176 |70,660,70
177 |102
194 |102,102


我已经尝试过Google,但是找不到任何相关的解决方案。

最佳答案

这样做确实不可行。由于这样的问题,逗号分隔的列表在数据库中通常是一个非常糟糕的主意。

如果不是快速或灵活的,则有可能。

下面是通过生成1到1000(或比逗号数多1)的数字列表来实现的。仅当逗号分隔值的最大数目小于1000时,此方法才有效。可以轻松扩展以应对更大的数字,但扩展时效率甚至更低。

然后,它使用该范围的数字从逗号分隔的列表中提取一个值。

一旦完成,就可以使用AVG功能。

SELECT uID,
        AVG(individual_responded_in_hour)
FROM
(
    SELECT uID,
            CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(text_responded_in_hour, ',', (hundreds.aCnt * 100 + tens.aCnt * 10 + units.aCnt + 1)), ',', -1) AS SIGNED) AS individual_responded_in_hour
    FROM some_table
    CROSS JOIN (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) units
    CROSS JOIN (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) tens
    CROSS JOIN (SELECT 1 AS aCnt UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10) hundreds
    WHERE (hundreds.aCnt * 100 + tens.aCnt * 10 + units.aCnt) <= (LENGTH(text_responded_in_hour) - LENGTH((REPLACE(text_responded_in_hour, ',', '')))
) sub0
GROUP BY uID


可以使用自定义的MySQL函数来执行此操作,这样可能会更有效率。

但是无论哪种方式,我都建议这样做很复杂,这是不将值存储在逗号分隔列表中的一个很好的理由。

关于mysql - 如何从MySQL中逗号分隔的字符串值计算中位数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43629549/

10-16 04:48