找到与Min/Max关联的行,没有内部循环

11 sql t-sql sql-server

我有一个与T-SQL和SQL Server有关的问题.

假设我有一个包含2列的表订单:

  • ProductId int
  • CustomerId int
  • 日期日期时间

我想要每个产品的第一个订单的日期,所以我执行这种类型的查询:

SELECT ProductId, MIN(Date) AS FirstOrder 
FROM Orders
GROUP BY ProductId
Run Code Online (Sandbox Code Playgroud)

我有一个索引ProductId,包括列CustomerIdDate加速查询(IX_Orders).查询计划看起来像是非聚集索引扫描IX_Orders,后面是流聚合(由于索引没有排序).

现在我的问题是我还要检索CustomerId与每个产品的第一个订单相关联的产品(产品26在25日星期二首次订购,由客户12订购).棘手的部分是我不希望在执行计划中有任何内部循环,因为这意味着ProductId表中的每个额外读取,这是非常低效的.

这应该可以使用相同的非聚集索引扫描,然后是流聚合,但是我似乎无法找到可以执行此操作的查询.任何的想法?

谢谢

Jos*_*ton 0

SELECT
    o1.productid, 
    o1.date, 
    o1.customerid
FROM
    Orders o1
JOIN
    (select productid, min(date) as orderDate
     from Orders
     group by productid
    ) firstOrder
ON o1.productid = firstOrder.productid
Run Code Online (Sandbox Code Playgroud)

这是我能想到的最好的结果,但说实话,我不知道这个查询的性能特征是什么。如果不好,我可能建议运行两个查询来获取您想要的信息。

  • 此查询得到错误的答案,因为它在 o1 和 firstOrder 之间的联接中不包含日期 (2认同)