【问题标题】:Advanced row limiting高级行限制
【发布时间】:2015-03-26 15:35:55
【问题描述】:

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

【问题讨论】:

  • 您可以使用LimitUnion 来获得您想要的。
  • 你的意思是在开始和结束之间得到相当均匀的 23 个点吗?
  • 微软确实与 MySQL 没有任何关系。请用您实际使用的数据库标记问题。

标签: mysql sql-server


【解决方案1】:

这是一种方法:

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;

但这是一种非常幼稚的方式。

【讨论】:

  • 请注意,LIMIT 是一个 MySQL 结构。
【解决方案2】:

我会推荐窗口函数:

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)

【讨论】:

  • 请注意,此答案中的大部分语法仅适用于 Sql Server,不适用于 MySQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
相关资源
最近更新 更多