mysql - 将子查询放入偏移子句
问题描述
假设我有一个包含一列的表格(数字):
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 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 |
看演示
推荐阅读
- c++ - 在 Crypto++ 中使用 ECDSA 的正确方法是什么
- uwp - 除非大小更改,否则 UWP CommandBar 更多按钮不显示
- javascript - 条件 scss 或覆盖变量
- android - 使用androidx.fragment.app.Fragment,发现在initView()中无法初始化initAdapter(),为什么?
- flutter - 执行 gitlab 管道作业后执行 codemagic 构建
- django - 当我单击图像然后在其他 html 页面上显示 3 个图像但是这 3 个图像对于每个单击的图像都是不同的
- c# - Visual Studio 2019 IIS Express 无限等待
- node.js - 使用 heroku 在 nodejs 应用程序中匹配 os.type() 失败
- android - 由于数据绑定,Espresso 测试失败
- javascript - 如何在不使用任何内置函数的情况下获取对象数组中所有键值的总和