![](/img/trans.png)
[英]How to add an incremental counter to grouped rows, resetting the counter each time a variable changes
[英]How can I add an incremental number to each element in a grouped series?
我遇到一個名為Group
的表和名為Entry
的表的問題。 Group
表具有主鍵Id
。 Entry
表具有一個主鍵Id
,這是Group
表Id
的外鍵,稱為GroupId
。 Entry
表中還有一列Weight
。 這個權Weight
是一個整數,它所要做的就是告訴我排序權重,頂部顯示零。
基本上發生了什么事,有人在設計數據庫時使這個Weight
字段可為空。 現在,我需要遍歷並調整權Weight
以適應我們打算添加的UNIQUE
約束: UNQIUE(GroupId, Weight)
到Entry
表。 當兩個Entry
條目基本上位於同一組中時,這可以防止它們具有相同的排序權重。
什么查詢將讓我去通過我們現有的數據,只是人數的Weight
在每個條目上逐組基礎上從0到N列,其中N是多少Entry
條目在一個Group
? 我想根據Entry
的Id
設置權重,以便給定Group
Entry
的最低Id
獲得最低的Weight
。
我想要一個大型查詢,該查詢將通過Group
表,將所有Entry
條目合並在一起,然后遍歷它們並分配順序。 但是,我不知道從哪里開始。
本質上,您將使用MS SQL Over子句
這是一個sqlfiddle示例,向您展示如何在一個查詢中進行操作
希望這可以幫助。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.