• Как оптимизировать TSQL запрос подобной конструкции?

    @SHA1024 Автор вопроса
    Да. Выполняется около 1.5 ч. Приведу полностью запрос:

    DECLARE	@COURSES TABLE (
    			id bigint
    		);
    INSERT	@COURSES
    SELECT	cs.id
    FROM	courses cs
    		JOIN course c ON c.id=cs.id
    WHERE	c.data.exist('course/custom_elems/custom_elem[name=\"remove_worst_attempts\" and value=\"true\"]')=1;
    
    DECLARE	@LEARNINGS TABLE (
    			person_id bigint,
    			course_id bigint
    		);
    INSERT	@LEARNINGS
    SELECT	ls.person_id,
    		ls.course_id
    FROM	learnings ls
    WHERE	ls.course_id IN (SELECT id FROM @COURSES)
    GROUP	BY ls.course_id, ls.person_id
    HAVING	COUNT(ls.id)>1;
    
    DECLARE @TOP_LEARNINGS TABLE (
    			id bigint
    		);
    INSERT	@TOP_LEARNINGS
    SELECT	id = (
    			SELECT	TOP 1 id
    			FROM	learnings
    			WHERE	person_id=l.person_id AND course_id=l.course_id
    			ORDER	BY (
    						CASE 
    							WHEN state_id=4 THEN 5
    							WHEN state_id=2 THEN 4
    							WHEN state_id=5 THEN 3
    							WHEN state_id=3 THEN 2
    							ELSE state_id
    						END
    					) DESC, score DESC, creation_date DESC
    		)
    FROM	@LEARNINGS as l;
    
    SELECT	id
    FROM	learnings ls
    WHERE	ls.id NOT IN (SELECT id FROM @TOP_LEARNINGS)
    		AND ls.course_id IN (SELECT id FROM @COURSES);


    Я предполагаю, что возможно есть способ оптимизировать по скорости конструкцию типа "для каждой записи выбрать максимальное значение с учетом нескольких параметров".