能不能只取ROW_NUMBER中的rn = 1,不取其余的rn来提高查询速度?

Is it possible to get only rn = 1 in ROW_NUMBER without getting the rest of the rn to increase query speed?

所以我有一个问题:

(ROW_NUMBER() OVER (PARTITION BY itm.storeID, itm.skuID ORDER BY itm.effectiveDate DESC)) AS rn,

然后我会做的是在 table 中使用 foreach 然后扫描 rn 是否等于 1,如果等于则我将添加一个值,所以基本上我对 rn 是的所有行求和等于 1...

问题是 row_number 的查询很慢(不是 foreach),因为它返回了 400,000 多行。查询是按月进行的,所以我每个分区总共得到 30 rn。那么我只需要rn等于1的行...

有没有办法更快地做到这一点?如果我像这样包装查询:

SELECT * FROM (... rn query) t WHERE t.rn = 1

然后我仍然获取整个 rn 然后它只会过滤,所以我并没有真正使查询更快...

我还尝试将它放在临时 table 中,因为我正在使用 Laravel 但它不起作用,因为我使用不同的 DB_HOST 进行读写...

一种方法可能是在单独的子查询 (Derived Table) 中获取分区的 effectiveDate 的最大值。之后,您可以 JOIN 回到主 table,以获取该特定行。

在这里定义一个合适的复合索引也会有所帮助。

尝试以下操作:

SELECT itm.* FROM itm 
JOIN (SELECT store_id, skuID, MAX(effectiveDate) AS maxDate 
      FROM itm 
      GROUP BY storeID, skuID) AS dt 
  ON dt.skuID = itm.skuID
 AND dt.storeID = itm.storeID 
 AND dt.maxDate = itm.effectiveDate

您需要定义一个复合索引:(storeID, skuID, effectiveDate)以获得最佳性能。