使用mysql,从子查询select中选择第n行

5vf7fwbs  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(416)

我有一个超过300000行的表,我想把这些数据呈现在一个图上,但是300000行并不是一次就必须的。例如,即使给定的一天可能有100行数据,如果我显示的是全年的数据,我也不需要显示所有的数据。所以我想“颗粒化”数据。
我想得到所有的东西,然后用一个脚本来删除我不需要的东西,但这似乎会更慢,更难的数据库。
这是我到目前为止的情况。

SET @row_number := 0;
  SELECT @row_number := @row_number + 1 as row_number, 
  price, region, timestamp as row_number FROM pricehistory;

这给了我所有的行和数字。我计划添加一个where子句,这样每1000行(即每n行)得到一个where子句

SET @row_number := 0;
SELECT @row_number := @row_number + 1 as row_number, 
  price, region, timestamp as row_number FROM pricehistory 
  WHERE row_number % 1000 = 0;

但mysql看不到 row_number 因为某种原因被列为专栏。有什么想法吗?我在网上看过其他的解决方案,但它们似乎并不特别适用于mysql。

zysjyyx4

zysjyyx41#

正如racil的评论所建议的那样,如果你有一个自动递增的id字段,那么你可以只通过它;但是您已经声明了不同日期的数据量可能不同,因此这可能会导致一个非常扭曲的图形。如果您选择一年中的每1000条记录,并且一半的行来自最近3个月(例如,商业中的“假日购物”),那么下半年的图表将实际反映一年的下一季度。为了获得更有用的结果,您最好使用以下方法:

SELECT region, DATE(timestamp) AS theDate
    , AVG(price), MIN(price), MAX(price)
FROM pricehistory
GROUP BY region, theDate
;
nc1teljy

nc1teljy2#

看起来我不会得到另一个答案,所以我会继续写我想出的解决方案。
我的数据分布相当均匀,因为它以固定的间隔获取价格,所以没有理由担心这一点。
这是我的解决办法。
假设我有500000行,我想显示这些行的子集,比如说5000行。500000/5000是100,所以我取100,在我的select语句中使用它 SELECT * FROM pricehistory where id % 100 = 0; 这是实际代码 public function getScaleFactor($startDate, $endDate) { $numPricePoints = $this->getNumPricePointsBetweenDates($startDate, $endDate); $scaleFactor = 1; if ($numPricePoints > $this->desiredNumPricePoints) { $scaleFactor = floor($numPricePoints / $this->desiredNumPricePoints); } return $scaleFactor; } 然后我使用 $scaleFactor 在sql中 SELECT * FROM pricehistory WHERE id % {$scaleFactor} = 0; 这并不是一个完美的解决方案,因为你并不总是最终得到5000行,但我不需要确切的5000行。我只是试图降低数据的分辨率,同时仍然得到一个看起来接近于我使用所有500000行的图形。

相关问题