У меня есть запрос, в котором несколько факторов определяют фактическую активную строку.Могу ли я сделать это в режиме реального времени и при этом оставаться продуктивным, или подход с битовым полем является общепринятым подходом, где указывается, индексируется и запрашивается текущее активное поле?
Мое решение в реальном времени включаетпромежуточный шаг в представлении (временная таблица в моем примере ниже).Поэтому я обеспокоен производительностью, потому что мне придется иметь дело с сотнями тысяч до миллионов записей.
Для иллюстрации:
DECLARE @grades TABLE (
person int,
grade int,
attempt int,
correction int)
INSERT @grades VALUES (1, 80, 1, 0)
INSERT @grades VALUES (1, 90, 2, 0)
INSERT @grades VALUES (1, 100, 3, 0)
INSERT @grades VALUES (2, 95, 1, 0)
INSERT @grades VALUES (2, 80, 1, 1)
INSERT @grades VALUES (2, 90, 1, 2)
INSERT @grades VALUES (2, 89, 1, 3)
SELECT b.*
INTO #grades_corrected
FROM @grades AS b
RIGHT JOIN (
SELECT person, attempt, MAX(correction) AS last_correction
FROM @grades as b
GROUP BY person, attempt
)
AS last_corrections
ON (b.attempt = last_corrections.attempt
AND b.correction = last_corrections.last_correction
AND b.person = last_corrections.person
)
SELECT g.*
FROM #grades_corrected g
LEFT OUTER JOIN #grades_corrected g2 ON (
g.person = g2.person
AND g.grade < g2.grade)
WHERE g2.grade is null
DROP TABLE #grades_corrected