Как обрабатывать группы в порядке их появления в SQL? - PullRequest
0 голосов
/ 23 мая 2011

Я хочу запустить таблицу ниже и каждый раз обрабатывать разные группы.1-й раз процесс childs 3,4,5 из group 1, затем 8 из group 4 и затем 6,7 из group 3.

Я пытался использовать CURSOR , но я не сделалКаждый раз мне удавалось получать разные группы.

ВАЖНО : я должен обработать группы в порядке их появления, а именно: группа № 1, затем № 4, а затем # 3

ОБНОВЛЕНО

id          group      child
----------- ----------- -----------
1           1           3
2           1           4
3           1           5
4           4           8
5           3           6
6           3           7

Я использовал запрос

declare @tbl table ( 
        id int identity(1,1) not null, 
        parent int null, 
        child int null);

WITH t1 (parent, child)
AS
(
    SELECT Parentid, Id
    FROM mytable
    WHERE ParentId = 1 and Id <> ParentId
    UNION ALL
    SELECT Parentid,Id
    FROM mytable t2, t1
    WHERE t2.ParentId = t1.child            
)

insert into @tbl(parent, child)
SELECT parent,child
FROM t1

SELECT * 
FROM @tbl

Спасибо

Ответы [ 4 ]

4 голосов
/ 23 мая 2011

SQL Server не гарантирует порядок записей, если вы не укажете ORDER BY.

Даже при вставке их непосредственно в таблицу и чтении их обратно, параллелизме, соображениях хранения, индексах и т. Д.-sorts (мой технический термин) может привести к тому, что они будут прочитаны в другом порядке.

Это не означает, что вы каждый раз получаете новый заказ, просто вы не можете гарантировать заказ без ЗАКАЗАBY.


В вашем случае это означает, что вам нужен еще один столбец, чтобы указать, в каком порядке были вставлены данные.Простой способ сделать это - создать столбец IDENTITY на столе.Порядок вставки данных будет сохранен в этом столбце, и вы можете использовать его в ORDER BY.

0 голосов
/ 24 мая 2011

Вы можете использовать функцию группировки MIN для сортировки родителей по порядку, в котором они впервые появляются в последовательности.Функция ранжирования, такая как ROW_NUMBER() или RANK(), получит порядковый номер каждого родителя.

SELECT parent,
    RANK() OVER (ORDER BY MIN(id)) [ranking]
FROM t1
GROUP BY parent
ORDER BY [ranking]
0 голосов
/ 23 мая 2011

Этот скрипт вернет именно то, что мне нужно. Возвращает группу в порядке 1,4,3 а не 1,3,4 Сценарий и результат приведены ниже.

declare @tbl table ( 
            id int identity(1,1) not null, 
            parent int null, 
            child int null);

    WITH t1 (parent, child)
    AS
    (
        SELECT Parentid, Id
        FROM mytable
        WHERE ParentId = 1 and Id <> ParentId
        UNION ALL
        SELECT Parentid,Id
        FROM mytable t2, t1
        WHERE t2.ParentId = t1.child            
    )

    insert into @tbl(parent, child)
    SELECT parent,child
    FROM t1

    select id, parent
    from (select max(id) as id, parent
         from @tbl
         group by parent) t
    order by t.id

Результат

 id          parent
----------- -----------
3           1
4           4
6           3
0 голосов
/ 23 мая 2011

Вы можете использовать функции ранжирования RANK() и ROW_NUMBER() вместе с предложением ORDER BY для уточнения порядка результатов.

SELECT parent, child,
    RANK() OVER (ORDER BY parent) [group],
    ROW_NUMBER() OVER (PARTITION BY parent ORDER BY child) [item]
FROM t1
ORDER BY parent, child
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...