一句话-维基百科的一篇引文:ORDER BY
ORDER BY是对结果集中的行进行排序的唯一方法。
没有此子句,关系数据库系统可以按任何顺序返回行。如果需要排序,则必须在应用程序发送的SELECt语句中提供ORDER
BY。尽管某些数据库系统允许在子选择或视图定义中指定ORDER BY子句,但该显示不起作用。视图是逻辑关系表,
关系模型要求一个表是一组行,这意味着没有排序顺序。
由于您需要计算当前 行和前一行 的中位数,因此表中必须有一个附加行, 该 行定义 了行的顺序,
并且可以用来确定给定行之前的行和之后的行。
让我们说这样的一
id列:
| id | x | rolling_median_x ||----|---|------------------|| 1 | 4 | 4 || 2 | 1 | 2.5 || 3 | 3 | 3 || 4 | 2 | 2.5 || 5 | 1 | 2 || 6 | 6 | 2.5 || 7 | 9 | 3 |
如果您不能使用解析函数,请尝试使用纯SQL。
本文介绍了使用SQL计算中位数的各种方法。
我认为,亨德森的中位数将最适合我们的需求:
SELECT CASE COUNT(*) % 2 WHEN 0 -- even sized table THEN (P1.part_wgt + MIN(CASE WHEN P2.part_wgt > P1.part_wgt THEN P2.part_wgt ELSE NULL END))/2.0 ELSE P1.part_wgt --odd sized table END AS median FROM Parts AS P1, Parts AS P2 GROUP BY P1.part_wgtHAVINg COUNT(CASE WHEN P1.part_wgt >= P2.part_wgt THEN 1 ELSE NULL END) = (COUNT(*) + 1) / 2;
只需将每行的查询作为一个依赖子查询运行,一般的想法是这样的:
SELECt t.*, ( SELECT .... Henderson's query FROM table x WHERe x.id <= t.id ...... ) As our_medianFROM table t
您可以在此演示中找到示例实现
SELECt t.*, ( SELECT CASE COUNT(*) % 2WHEN 0 -- even sized tableTHEN (P1.x + MIN(CASE WHEN P2.x > P1.x THEN P2.x ELSE NULL END))/2.0ELSE P1.x --odd sized tableEND AS median FROM Table333 AS P1, Table333 AS P2 WHERe p1.id <= t.id AND p2.id <= t.id GROUP BY P1.x HAVINg COUNT(CASE WHEN P1.x >= P2.xTHEN 1ELSE NULL END)= (COUNT(*) + 1) / 2 ) as Our_medianFROM Table333 t;| id | x | rolling_median_x | our_median ||----|---|------------------|------------|| 1 | 4 | 4 | 4 || 2 | 1 | 2.5 | 2.5 || 3 | 3 | 3 | 3 || 4 | 2 | 2.5 | 2.5 || 5 | 1 | 2 | 2 || 6 | 6 | 2.5 | 2.5 || 7 | 9 | 3 | 3 |
这个查询可能会很慢-这是您必须拥有古代版本的PostgreSQL所要付出的代价



