如何将升序字段与降序字段相同?

时间:2019-01-06 00:25:21

标签: mysql

我需要一个查询,该查询将数据列表(仅是表中浮点数据的一个字段)与以升序相同的字段相邻

为了上下文,我正在练习我的(非常)基本和(非常)生锈的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

...但是我的订单似乎没有保留。我想我基本上可以对这两列进行“联接”,但是我不确定如何为要联接的每一个引入索引。

先谢谢了!

编辑:很抱歉造成混乱:我不是在寻找解决更广泛的计算中位数问题的方法,只是为了帮助我自己解决这个问题而做一点努力!

2 个答案:

答案 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