- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在尝试优化一些查询和脚本,我想知道是否有一种方法可以切断一定比例的 MySQL 结果集?
例如,我有一个这样的查询:
SELECT TrackingID, OpenTime, FirstPoint
FROM PointsTable
我需要“中间的”74%,按 FirstPointGMT 和 OpenTimeGMT 之间的差值排序,这意味着:我需要切掉顶部和底部的 13%。
目前,脚本将只获取所有行,按持续时间计算和排序,然后将它们切断,但如果可能的话,我想在 SQL 查询中执行此操作以使脚本更清晰。
我知道 LIMIT 条款,但它似乎不支持像“13%”这样的相对值。
谁能告诉我 a) 这是否真的只能通过 SQL 实现,b) 如何实现?
MySQL 是 5.0.45。
PS:是的,我知道 13% 似乎是一个非常奇怪的数字,但这都是一个更大过程的一部分。
最佳答案
您需要根据结果集中返回的行所在的百分位数来限制返回的数据。
试试这个:
SELECT TrackingID, OpenTime, FirstPoint
FROM PointsTable
ORDER BY FirstPointGMT - OpenTimeGMT
LIMIT (13*((SELECT COUNT(*) FROM PointsTable) +1) / 100),
((SELECT COUNT(*) FROM PointsTable)
-
(26*((SELECT COUNT(*) FROM PointsTable) +1) / 100)
)
上面的解释
这里唯一棘手的是 Limit 子句及其语法:
> LIMIT start_row,number_of_rows_to_return
我们的 start_row 需要是结果集中第一条记录 13/100ths(13% 的方式)之后的第一个元素。为此,我们使用以下公式:
rownumber_or_number_of_rows_in_resultset_Npercent_in =
( Npercent * ( number_of_rows_in_resultset + 1) / 100)
这是 (13*((SELECT COUNT(*) FROM PointsTable) +1)/100)
。
我们的 number_of_rows_to_return 必须是总行数减去 26% 的行(底部 13%,顶部 13%),或者
(total_number_of_rows - number_of_rows_26percent_of_the_way_in)
因此实际计算是:
( (SELECT COUNT(*) FROM PointsTable)
-
(26*((SELECT COUNT(*) FROM PointsTable) +1) / 100)
)
编辑:在查看了 Niyaz 的回复后,我意识到查询可以重写为:
SELECT TrackingID, OpenTime, FirstPoint
FROM PointsTable
ORDER BY FirstPointGMT - OpenTimeGMT
LIMIT (13*((SELECT COUNT(*) FROM PointsTable) +1) / 100),
(74*((SELECT COUNT(*) FROM PointsTable) +1) / 100)
这更简洁,因为它消除了第三个嵌套查询,并且在功能上应该是等效的。限制行数,从距顶部 13% 的行开始,并从该点开始显示表格总行数的 74%。
关于mysql - 从 MySQL 查询的顶部和底部切除 13%?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512138/
我是一名优秀的程序员,十分优秀!