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