У меня есть приведенный ниже SQL, который необходимо оптимизировать (имя «свойства» было изменено на более общее в приведенном ниже коде):
Он работает в Azure SQL
SELECT ContactValueA, ContactValueB, SUM(X.Price) as Price, SUM(X.ValueX) AS ValueX, SUM(X.ValueY) AS ValueY, Count (*) As [Count]
FROM
(
SELECT OL.id, O.ContactValueA, O.ContactValueB,
OL.Price,
OL.ValueX,
OL.ValueY
FROM [OrderLines] AS OL
JOIN [Orders] AS O
ON OL.OrderId = O.Id
WHERE O.Id in
(
SELECT MIN(SO.Id) AS OID
FROM [Orders] AS SO
WHERE SO.[Type] = 'cake'
AND SO.Created >= @begin and SO.Created < @end
AND NOT EXISTS
(
SELECT 1
FROM [3Orders] AS SOA
WHERE SOA.ExtOrderId = SO.ExtOrderId
AND SOA.[Type] = 'cake'
AND SOA.Created < @begin
)
GROUP BY SO.ExtOrderId
)
) X
GROUP BY X.ContactValueA, X.ContactValueB
@ begin и @end оба DateTimeOffset
Если мы посмотрим на эту часть кода:
SELECT MIN(SO.Id) AS OID
FROM [Orders] AS SO
WHERE SO.[Type] = 'cake'
AND SO.Created >= @begin and SO.Created < @end
AND NOT EXISTS
(
SELECT 1
FROM [3Orders] AS SOA
WHERE SOA.ExtOrderId = SO.ExtOrderId
AND SOA.[Type] = 'cake'
AND SOA.Created < @begin
)
GROUP BY SO.ExtOrderId
О таблице заказов - Каждый заказ имеет уникальный идентификатор и неуникальный ExtOrderId - поскольку запись в таблице заказов может быть частичным заказом (частичные заказы имеют один и тот же ExtOrderId)
В приведенном выше коде мне нужно просмотреть все заказы (частичные заказы) между двумя datetimeoffsets - и взятьчастичные заказы с наименьшим идентификатором - но идентификатор частичного заказа (ExtOrderId) не должен иметь заказ до даты начала.
Есть предложения, как это оптимизировать?