首页 > 解决方案 > 将子查询放入偏移子句

问题描述

假设我有一个包含一列的表格(数字):

 n
---
 4
 5
67
23
 7
89

我想得到中位数(只有偶数列表)。我认为这很容易,所以我写道:

SELECT SUM(ord.n)/2
FROM (
      SELECT n 
      FROM numbers 
      ORDER BY n ASC
      LIMIT 2 OFFSET (SELECT COUNT(n)/2-1 FROM numbers)
     ) AS ord

但当然它会给我带来语法错误。我想我不能将子查询插入偏移量,但我想知道我必须做什么才能获得预期的结果?我知道有不同的方法来编写查询以获得中位数,但我需要知道是否有可能将“变量”插入偏移量而不是放置一些数字?

标签: mysql

解决方案


我认为您正在寻找下面的查询,这应该适用于 MySQL 5.1 及更高版本

SELECT 
 AVG(filter.n)
FROM (

SELECT 
   *
 , (@position := @position + 1) AS init_position  
FROM 
 t
CROSS JOIN (
   SELECT
      @position := 0
    , @max := (SELECT COUNT(t.n) FROM t)
    , @median_mode := (CASE WHEN ((@max % 2) = 0) THEN 'even' ELSE 'odd' END)
 ) AS init_user_param
ORDER BY 
 t.n ASC

) AS filter
WHERE 
 CASE 
  WHEN @median_mode = 'even' 
  THEN filter.init_position BETWEEN (@max / 2) AND ((@max / 2) + 1)

  WHEN @median_mode = 'odd' 
  THEN filter.init_position = ((@max + 1) / 2)
 END

结果

| AVG(filter.n) |
| ------------- |
| 15            |

演示

89 不在列表中时的结果。

| AVG(filter.n) |
| ------------- |
| 7             |

演示


推荐阅读