我需要一个查询,该查询将数据列表(仅是表中浮点数据的一个字段)与以升序相同的字段相邻。
为了上下文,我正在练习我的(非常)基本和(非常)生锈的SQL(特别是MySQL)。我正在解决的更大问题是this HackerRank question,它是从LAT_N
表中计算STATION
字段的中位数。
我的策略是从表中返回,其数据在第一列(up_LAT_N
中升序排列,数据在第二列(down_LAT_N
中降序排列)为满足条件(cond
)的第一行,即升序字段中的基准大于或等于降序字段中的基准。这个平均值就是中位数。
我尝试了以下操作:
SELECT up.LAT_N AS up_LAT_N,
down.LAT_N AS down_LAT_N,
CASE
WHEN up.LAT_N >= down.LAT_N THEN 1 ELSE 0
END AS cond
FROM
(SELECT LAT_N FROM STATION ORDER BY LAT_N) up,
(SELECT LAT_N FROM STATION ORDER BY LAT_N DESC) down
...但是我的订单似乎没有保留。我想我基本上可以对这两列进行“联接”,但是我不确定如何为要联接的每一个引入索引。
先谢谢了!
编辑:很抱歉造成混乱:我不是在寻找解决更广泛的计算中位数问题的方法,只是为了帮助我自己解决这个问题而做一点努力!
答案 0 :(得分:0)
订购子查询没有任何意义。如果需要视觉排序,则需要在外部查询上进行。
SELECT up.LAT_N AS up_LAT_N
down.LAT_N AS down_LAT_N
CASE
WHEN up.LAT_N >= down.LAT_N THEN 1 ELSE 0
END AS cond
FROM STATION up, STATION down
ORDER BY up.LAT_N, down.LATN DESC
答案 1 :(得分:0)
我要解决的更大问题是这个HackerRank问题,该问题是从STATION表中计算LAT_N字段的中位数。
您可以使用以下查询直接计算中位数:
SELECT AVG(dd.lat_n) as median_val
FROM (
SELECT d.lat_n, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
FROM station d, (SELECT @rownum:=0) r
WHERE d.lat_n is NOT NULL
-- put some where clause here
ORDER BY d.lat_n
) as dd
WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) )
在this db fiddle中进行了测试(行数为偶数,这是处理中位数时最复杂的情况)。
有关该技术的说明,请参见this excellent SO post。