高级行限制

时间:2015-03-26 15:35:55

标签: mysql sql-server

我有GPS数据表:坐标,方向,速度和日期时间。我想选择25行多个。 它应该返回其中的第一行,最后一行和其他23行。它可以使用日期时间值来使选择更有效(例如,跳过具有小时间跨度的行)。想法是获得有限数量的坐标,但仍然能够在地图上查看路线。

2 个答案:

答案 0 :(得分:0)

这是一种方法:

SELECT * FROM table ORDER BY RAND() LIMIT 23
UNION 
SELECT * FROM table ORDER BY column ASC LIMIT 1
UNION
SELECT * FROM table ORDER BY column DESC LIMIT 1;

但这是一种非常天真的方式。

答案 1 :(得分:0)

我建议使用窗口函数:

select t.*
from (select t.*,
             row_number() over (partition by (case when column in (mincol, maxcol) then 1 else 0 end order by newid()) as seqnum
      from (select t.*,
                   min(column) over () as mincol,
                   max(column) over () as maxcol
            from table t
           ) t
     ) t
where seqnum <= 23;

如果你真的想要25行,那么逻辑很棘手。如果少于25个,则需要获取所有行。您需要确保随机样本不包含第一行和最后一行。这只是将最小值和最大值放在一个单独的分区中,因此它们编号为1和2.因此,最终的where子句将获得所有这些。

以下内容相同,但意图可能更清晰:

where seqnum <= 23 or column in (mincol, maxcol)