如何为分组系列中的每个元素添加增量编号?

时间:2013-07-20 03:41:18

标签: sql sql-server row-number data-partitioning over-clause

我遇到的问题是我有一个名为Group的表和一个名为Entry的表。 Group表有一个主键IdEntry表包含一个主键Id,即Group表的Id的外键GroupIdEntry表还有一列Weight。这个Weight是一个整数,它只是告诉我在顶部显示零的排序权重。

基本上发生的事情是,有人在设计数据库时使这个Weight字段可以为空。现在我需要调整Weight以适应我们打算将UNIQUE约束UNQIUE(GroupId, Weight)添加到Entry表中。这可以防止两个Entry条目在它们基本处于同一组时具有相同的排序权重。

什么查询可以让我浏览所有现有数据,只需逐个编号分组每个条目的Weight列,从0到N,其中N是{{1}的数量Entry中的条目?我想根据Group的{​​{1}}设置权重,以便给定IdEntry的最低Id获得最低Entry Group 1}}。

我想要一个大的ol'查询将通过Weight表,加入所有Group条目,然后迭代它们并分配序列。但是,我不知道从哪里开始。

1 个答案:

答案 0 :(得分:1)

基本上你会使用MS SQL Over Clause

这是sqlfiddle sample to show you how to do it in one query

希望这有帮助。

CREATE TABLE Entry (Id INT PRIMARY KEY, GroupId INT, Weight INT);

CREATE TABLE [Group] (Id INT PRIMARY KEY, Label VARCHAR(10));

INSERT [Group] (Id, Label)
VALUES(1, 'test');


INSERT Entry (Id, GroupId, Weight)
VALUES(1,1, null)

INSERT Entry (Id, GroupId, Weight)
VALUES(2,1, null)

INSERT Entry (Id, GroupId, Weight)
VALUES(3,1, null)

UPDATE E
  SET E.WEIGHT = o.WEIGHTIS
--SELECT *
FROM Entry E
INNER JOIN (
    SELECT G.Id GID, E.Id EID, 
     ROW_NUMBER() OVER(PARTITION BY G.Id ORDER BY E.ID) WeightIs
    FROM [Group] G
    INNER JOIN Entry E
      ON G.Id = E.GroupId  
) o
ON o.GID = E.GroupID AND o.EID = E.Id