11 sql t-sql sql-server
我有一个与T-SQL和SQL Server有关的问题.
假设我有一个包含2列的表订单:
我想要每个产品的第一个订单的日期,所以我执行这种类型的查询:
SELECT ProductId, MIN(Date) AS FirstOrder
FROM Orders
GROUP BY ProductId
Run Code Online (Sandbox Code Playgroud)
我有一个索引ProductId
,包括列CustomerId
和Date
加速查询(IX_Orders
).查询计划看起来像是非聚集索引扫描IX_Orders
,后面是流聚合(由于索引没有排序).
现在我的问题是我还要检索CustomerId
与每个产品的第一个订单相关联的产品(产品26在25日星期二首次订购,由客户12订购).棘手的部分是我不希望在执行计划中有任何内部循环,因为这意味着ProductId
表中的每个额外读取,这是非常低效的.
这应该可以使用相同的非聚集索引扫描,然后是流聚合,但是我似乎无法找到可以执行此操作的查询.任何的想法?
谢谢
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)
这是我能想到的最好的结果,但说实话,我不知道这个查询的性能特征是什么。如果不好,我可能建议运行两个查询来获取您想要的信息。