使用SQl2008 R2。我有大量的记录(100k),这些记录按特定顺序排序(我在示例数据中使用了ID)。我必须保持这个顺序
每当设置字段更改时,我都希望增加组。我以为使用窗口函数会很容易,但是我被卡住了
我的数据是
身份证号码 1 A 1 2 B 2 3 B 2 4 B 2 5 A 1
要求的结果是
ID字母编号组ID 1 A 1 1 2 B 2 2 3 B 2 2 4 B 2 2 5 A 1 3
基本上,当Col1和Col2的组合更改为“何时排序”时,我想增加groupno。即,即使第1行和第5行都包含A 1,它们也必须具有唯一的GroupNo,因为它们被2、3、4插补了
(我的真实数据包含几个需要比较的字段)
-- Create tables to work with / Source and Destination
CREATE TABLE #Items
(
ID INT
,Letter VARCHAR(1)
,Number INT
)
CREATE TABLE #Results
(
ID INT
,Letter VARCHAR(1)
,Number INT
,GroupID int
)
INSERT INTO #Items
( ID,Letter, Number )
SELECT 1, 'A', 1
UNION
SELECT 2, 'B', 2
UNION
SELECT 3,'B', 2
UNION
SELECT 4, 'B', 2
UNION
SELECT 5, 'A', 1
SELECT * FROM #Items
ORDER BY ID
INSERT INTO #Results
( ID,Letter, Number, GroupID )
SELECT 1, 'A', 1, 1
UNION
SELECT 2, 'B', 2,2
UNION
SELECT 3,'B', 2,2
UNION
SELECT 4, 'B', 2,2
UNION
SELECT 5, 'A', 1,3
提前致谢
标记
解决此问题的一种简单方法是两个行号之差。这唯一地标识每个值序列。然后使用dense_rank()
。这是查询:
select ID, Letter, Number,
dense_rank() over (order by diff, letter) as GroupId
from (select i.*,
(row_number() over (order by id) -
row_number() over (partition by letter order by id)
) as diff
from #items i
) t
根据您的数据,行号,差异和最终值如下所示:
ID Letter Number RN-ID RN-Letter Diff GroupId
1 A 1 1 1 0 1
2 B 2 2 1 1 2
3 B 2 3 2 1 2
4 B 2 4 3 1 2
5 A 1 5 2 3 3
瞧!几乎像魔术。
这是有关SQL Fiddle的示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句