0

У меня есть ниже рекурсивного CTE:HOWTO: Включить столбец, который не является частью совокупной функции или группы по статье в SQL SERVER

DECLARE @T AS TABLE 
(
    PARENT_TEST_ID int, 
    TEST_ID int, 
    VALIDATED int, 
    ERR int 
) 

INSERT INTO @T VALUES 
(NULL, 1, 0, 0), 
(NULL, 2, 0, 0), 
(1,3,0, 0), 
(1,4,0, 0), 
(2,5,0, 0), 
(2,6,0, 0), 
(2,7,0, 0), 
(7,8,0, 1) 

;with C as 
(
    select TEST_ID, PARENT_TEST_ID, (CASE WHEN ERR=1 THEN 0 ELSE 1 END) AS VALIDATED, ERR 
    from @T 
    where TEST_ID not in (select PARENT_TEST_ID 
        from @T 
        where PARENT_TEST_ID is not null) AND PARENT_TEST_ID IS NOT NULL 
    union all 
    select 
    T.TEST_ID, 
    T.PARENT_TEST_ID, 
    (case when t.TEST_ID=c.PARENT_TEST_ID and c.VALIDATED=1 AND T.ERR=0 THEN 1 ELSE 0 END) as VALIDATED, 
    T.ERR 
    from @T as T 
    inner join C 
     on T.TEST_ID = C.PARENT_TEST_ID 
) 
SELECT DISTINCT PARENT_TEST_ID, TEST_ID, MIN(VALIDATED) FROM C 
GROUP BY TEST_ID 

Но я не могу включить столбец PARENT_TEST_ID в результате SELECT, поскольку он не является частью группы по статье, так что я нашел эту ссылку:

Including column that is not part of the group by

так что теперь я пытаюсь сделать то же самое в моем случае, я пытаюсь применить решение John Woo, но я не знаю, как. Любая помощь? Или любое другое лучшее решение?

+0

У меня есть если вы ответили на заданный вами вопрос, но из ваших тестовых данных я не думаю, что это на самом деле то, что вы хотите сделать. Можете ли вы указать желаемый результат, если мой ответ ниже - это не то, что вы пытаетесь сделать? – iamdave

ответ

0

Просто измените последнюю строку на GROUP BY PARENT_TEST_ID, TEST_ID

Погрешность вы получаете говорит вам, что вы не можете добавить столбцы к выходу, если вы этого не сделаете либо агрегат на нем или группировать другие агрегаты им. Добавив столбец в group by, вы сообщаете SQL Server, что вы хотите сделать свой min как родительским, так и значениями идентификатора теста.

rextester: http://rextester.com/JRF55398

0

iamdave правильно, но если вы хотите реализовать решение Джона Ву с этого связанного ответа, он будет выглядеть следующим образом:

rextester: http://rextester.com/QQQGM79701

;with C as (
    select 
    test_id 
    , parent_test_id 
    , validated=(case when err = 1 then 0 else 1 end) 
    , err 
    from @T as t 
    where t.test_id not in (
    select i.parent_test_id 
    from @T as i 
    where i.parent_test_id is not null 
    ) 
    and t.parent_test_id is not null 
    union all 
    select 
    t.test_id 
    , t.parent_test_id 
    , validated = case 
     when t.test_id = c.parent_test_id 
     and c.validated = 1 
     and t.err = 0 
     then 1 
     else 0 
     end 
    , t.err 
    from @T as T 
    inner join c on t.test_id = c.parent_test_id 
) 
, r as (
    select 
    parent_test_id 
    , test_id 
    , Validated 
    , rn = row_number() over (
     partition by test_id 
     order by Validated 
    ) 
    from C 
) 
select 
    parent_test_id 
    , test_id 
    , Validated 
    from r 
    where rn=1 
Смежные вопросы