我正在尝试进行大量的表格数据整理,其中单个记录需要根据相同的表格和以前的记录按日期整理数据。
目前,我有6个OUTER APPLY,每次运行1个日期大约需要3分钟。我可能需要50多个计算字段和多个日期,因此这开始看起来不可行。
是否有更好的方法来提高查询速度?
DECLARE @Date datetime;
SET @Date = '2018-01-01';
SELECT * --Not real Select, set as * to simplify
-- Following subquery normally contains methods to clean data
FROM (SELECT t1.* FROM (SELECT cleanFields1.* FROM Control AS cleanFields1
WHERE cleanFields1.[QDate] = @Date) AS t1) t1
-- Calculated Data
OUTER APPLY (
SELECT COUNT(*) AS ProductCountMonth
FROM Control t6
WHERE t6.[ProductName] = t1.[ProductName]
AND t6.[QDate] < t1.[QDate]
AND MONTH(t6.[QDate]) = MONTH(t1.[QDate])
) t6
OUTER APPLY (
SELECT COUNT(*) AS ProductMatchMonth
FROM Control t7
WHERE t7.[ProductName] = t1.[ProductName]
AND t7.[QDate] < t1.[QDate]
AND t7.[Issue] = '1'
AND MONTH(t7.[QDate]) = MONTH(t1.[QDate])
) t7
OUTER APPLY (
SELECT COUNT(*) AS ProductCountArea
FROM Control t8
WHERE t8.[ProductName] = t1.[ProductName]
AND t8.[QDate] < t1.[QDate]
AND t8.[AreaName] = t1.[AreaName]
) t8
OUTER APPLY (
SELECT COUNT(*) AS ProductMatchArea
FROM Control t9
WHERE t9.[ProductName] = t1.[ProductName]
AND t9.[QDate] < t1.[QDate]
AND t9.[Issue] = '1'
AND t9.[AreaName] = t1.[AreaName]
) t9
OUTER APPLY (
SELECT COUNT(*) AS ProductCountPType
FROM Control t10
WHERE t10.[ProductName] = t1.[ProductName]
AND t10.[QDate] < t1.[QDate]
AND t10.[PType] = t1.[PType]
) t10
OUTER APPLY (
SELECT COUNT(*) AS ProductMatchPType
FROM Control t11
WHERE t11.[ProductName] = t1.[ProductName]
AND t11.[QDate] < t1.[QDate]
AND t11.[Issue] = '1'
AND t11.[PType] = t1.[PType]
) t11
编辑:
SQLFiddle: http://sqlfiddle.com/#!18/9541d/1