У меня есть такая таблица:
![enter image description here](https://i.stack.imgur.com/7c26g.png)
Для каждого TaskConfigId есть TaskGuid.Если TaskGuid одинаков для того же TaskConfigId, кажется, что они для одной и той же задачи.Обычно TaskStatusId будет 10 или 20. Когда что-то случится, TaskStatusId будет иметь другие значения, например 15. Но для каждой задачи у него всегда есть 10 и 20.
Итак, если статус задачи имеет10 и 20, это означает, что ничего особенного не произошло.
Теперь я хочу выяснить для TaskConfigId (например, 100), когда это последний CreatedDate, и он имеет только TaskStatusId 10 И 20, никаких другихценности.Поэтому, если TaskConfigId равен 40, выделенный регистр неверен.
Вот что у меня есть
SELECT TOP (1) CreatedDate
FROM [aptfeed].[TaskTracking]
WHERE TaskGuid IN (
SELECT TaskGuid
FROM [aptfeed].[TaskTracking]
WHERE TaskConfigId = 100
GROUP BY TaskGuid HAVING COUNT(*) = 2
)
AND TaskStatusId = 10 -- start
ORDER BY CreatedDate DESC
По сути, он группирует TaskGuid для TaskConfigId, убедитесь, что в нем 2 записи.Сортируйте его, а затем получите последний.
Мой вопрос: что, если я хочу убедиться, что 2 записи - 10 И 20 (если мы можем убедиться, что сначала 10, а затем 20, то лучше)?
Я пробовал это:
SELECT TOP (1) CreatedDate
FROM [aptfeed].[TaskTracking]
WHERE TaskGuid IN (
SELECT TaskGuid
FROM [aptfeed].[TaskTracking]
WHERE TaskConfigId = 100
AND (TaskStatusId = 10 OR TaskStatusId = 20)
GROUP BY TaskGuid HAVING COUNT(*) = 2
)
AND TaskStatusId = 10 -- start
ORDER BY CreatedDate DESC
Но это не работает, так как он сначала отфильтровал все остальные TaskStatusId.Таким образом, почти все COUNT (*) будут равны 2, т.е. в снимке экрана будет выбран TaskConfigId = 40, поскольку будет отфильтрована строка 14.
Кроме того, я чувствую, что используемый мной запрос медленныйтак как он должен сгруппировать все TaskGuid для TaskConfigId.Любые предложения по улучшению этого?
Спасибо