如何按照它们在SQL中出现的顺序处理组?

时间:2011-05-23 15:33:01

标签: sql sql-server tsql sql-server-2008

我想在下表中运行,每次都要处理不同的组。第一次处理3,4,5的{​​{1}}个孩子,然后是group 1的{​​{1}},然后是8的{​​{1}}。

我尝试使用 CURSOR ,但我没有设法让每次都有不同的群体。

重要:我必须按照它们出现的顺序处理这些组,即组#1,然后是#4,然后是#3

已更新

group 4

我使用的查询是

6,7

谢谢

4 个答案:

答案 0 :(得分:4)

除非您指定ORDER BY。

,否则SQL Server不保证记录的顺序

即使将它们直接插入表中并将其读回,平行度,存储注意事项,索引和各种(我的技术术语)也可能导致它们以不同的顺序被回读。

这并不意味着您每次都会得到不同的订单,只是在没有ORDER BY的情况下您无法保证订单。


在您的情况下,这意味着您需要另一列来说明数据的插入顺序。这样做的一个简单方法就是在桌面上创建一个IDENTITY列。插入数据的顺序将保留在该列中,您可以在ORDER BY中使用它。

答案 1 :(得分:0)

您可以使用排名函数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

答案 2 :(得分:0)

此脚本将完全返回我需要的内容。它以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

答案 3 :(得分:0)

您可以使用MIN分组功能按父母在序列中首次出现的顺序对父母进行排序。像ROW_NUMBER()RANK()这样的排名函数将获得每个父级的序数位置。

SELECT parent,
    RANK() OVER (ORDER BY MIN(id)) [ranking]
FROM t1
GROUP BY parent
ORDER BY [ranking]