gpt4 book ai didi

mysql - 从 MySQL 查询的顶部和底部切除 13%?

转载 作者:可可西里 更新时间:2023-11-01 07:55:22 27 4
gpt4 key购买 nike

我目前正在尝试优化一些查询和脚本,我想知道是否有一种方法可以切断一定比例的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com