【问题标题】:Finding Median Using MySQL使用 MySQL 查找中位数
【发布时间】:2021-06-18 07:43:28
【问题描述】:

我知道有很多方法可以找到中位数,但我正在尝试使用这种方法来找到中位数。有人可以向我解释为什么这不起作用吗?这里的错误是“无效使用组函数”,但是当我使用 HAVING 而不是 WHERE 时,系统无法识别 RowNumber 是什么。我很困惑。

SELECT
    ROUND(AVG(LS.LAT_N))
FROM(
    SELECT
        LAT_N,
        ROW_NUMBER() OVER (ORDER BY LAT_N) AS RowNumber
    FROM
        STATION
    ) AS LS
WHERE
    RowNumber IN (
        IF(
            FLOOR(COUNT(LS.LAT_N)/2+0.5) = CEIL(COUNT(LS.LAT_N)/2+0.5),
            FLOOR(COUNT(LS.LAT_N)/2+0.5),
            FLOOR(COUNT(LS.LAT_N)/2+0.5) AND CEIL(COUNT(LS.LAT_N)/2+0.5)
            )

【问题讨论】:

  • but I am trying to use this method ...请解释一下“这个”方法是什么。在不知道方法的情况下,我们可能无法给出完整的答案。
  • 有一个更简单的解决方案,涉及两个行号(asc 和 desc)并过滤两个数字匹配的行。

标签: sql median


【解决方案1】:

中位数是有序序列中的中间元素 - 如果有偶数,则为两个中间元素的平均值。

SELECT
    AVG(LAT_N)
FROM(
    SELECT
        LAT_N,
        ROW_NUMBER() OVER (ORDER BY LAT_N) AS RowNumber
    FROM
        STATION
    ) AS q
WHERE
RowNumber >= FLOOR ( (SELECT COUNT(*) FROM STATION)/2 + 0.5)
AND
RowNumber <= CEIL ( (SELECT COUNT(*) FROM STATION)/2 + 0.5)

这里是 dbfiddle https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b31e08f4ece61ecb95d9dde76c389fb1

【讨论】:

  • 什么 COUNT(*) 是偶数?在那种情况下,我不需要找到中间 2 个数字的平均值而不是只返回一个数字吗?
  • 糟糕 - 将其更改为考虑到这一点。
  • 这不起作用:dbfiddle.uk/….
  • @GordonLinoff 哎呀 - 已修复。
【解决方案2】:

我通常这样写:

SELECT AVG(LAT_N)
FROM (SELECT LAT_N,
             ROW_NUMBER() OVER (ORDER BY LAT_N) AS RowNumber,
             COUNT(*) OVER () as cnt
      FROM STATION
     ) s
WHERE 2 * RowNumber IN (CNT, CNT + 1, CNT + 2);

Here 是一个 dbfiddle。

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 2014-01-02
    • 1970-01-01
    • 2015-10-04
    • 2011-06-06
    • 2016-07-13
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多