SELECT rv.ReceiptInformationId
FROM dbo.ReturnVisit rv,
dbo.DimensionCategory dc where rv.Satisfaction = dc.Id
AND DC.ReservedField2=1
and rv.ReturnVisitDate = ( SELECT
MAX(rv1.ReturnVisitDate)
FROM
dbo.ReturnVisit rv1
WHERE
rv.ReceiptInformationId = rv1.ReceiptInformationId
GROUP BY rv1.ReceiptInformationId
)
这段代码我测试了一下,执行需要15分钟。ReturnVisit 表大概有8w的数据量
时间主要耗在下面的子查询:rv.ReturnVisitDate = ( SELECT
MAX(rv1.ReturnVisitDate)
FROM
dbo.ReturnVisit rv1
WHERE
rv.ReceiptInformationId = rv1.ReceiptInformationId
GROUP BY rv1.ReceiptInformationId
)
------解决思路----------------------
-- 建索引
CREATE INDEX IX_ReturnVisit_ID_Date
ON ReturnVisit (ReceiptInformationId,ReturnVisitDate)
INCLUDE (Satisfaction);
GO
;WITH t1 AS ( -- 求分组ID
SELECT ReceiptInformationId
FROM dbo.ReturnVisit
GROUP BY ReceiptInformationId
)
,t2 AS ( -- 取每个分组日期最大的一条
SELECT c.*
FROM t1
CROSS APPLY (
SELECT top 1
ReceiptInformationId,
Satisfaction
FROM dbo.ReturnVisit rv
WHERE rv.ReceiptInformationId = t1.ReceiptInformationId
ORDER BY ReturnVisitDate DESC
) c
)
-- 关联过滤
SELECT t2.ReceiptInformationId
FROM t2
JOIN dbo.DimensionCategory dc
ON t2.Satisfaction = dc.Id
WHERE dc.ReservedField2 = 1