Sql 如何在VARCHAR列上进行分区
脚本:Sql 如何在VARCHAR列上进行分区,sql,sql-server,tsql,Sql,Sql Server,Tsql,脚本: DECLARE @Table1 TABLE (ID int, STATUS varchar(1)) ; INSERT INTO @Table1 (ID, STATUS) VALUES (1, 'A'), (1, 'A'), (1, 'A'), (1, 'B'), (1, 'A'), (2, 'C'), (2
DECLARE @Table1 TABLE
(ID int, STATUS varchar(1))
;
INSERT INTO @Table1
(ID, STATUS)
VALUES
(1, 'A'),
(1, 'A'),
(1, 'A'),
(1, 'B'),
(1, 'A'),
(2, 'C'),
(2, 'C')
;
获取结果集
Select *,ROW_NUMBER()OVER(PARTITION BY STATUS ORDER BY (SELECT NULL))RN from @Table1
ID STATUS RN
1 A 1
1 A 2
1 A 3
1 A 4
1 B 1
2 C 1
2 C 2
需要输出
Select *,ROW_NUMBER()OVER(PARTITION BY STATUS ORDER BY (SELECT NULL))RN from @Table1
ID STATUS RN
1 A 1
1 A 2
1 A 3
1 A 4
1 B 1
2 C 1
2 C 2
首先,在您发布的insert语句中。4与1、2和3有何不同,如果它基于不同的列,则应将该列也包括在按子条款划分的“行数”中。因为否则它会认为4中的“A”和1,2,3中的“A”是相同的,因此将它们组合在一起
ID STATUS RN
1 A 1
1 A 2
1 A 3
1 B 1
1 A 1
2 C 1
2 C 2
插入@Table1
(身份证、身份证)
价值观
(1,'A'),试试这个
INSERT INTO @Table1
(ID, STATUS)
VALUES
(1, 'A'), <-- 1
(1, 'A'), <-- 2
(1, 'A'), <-- 3
(1, 'B'),
(1, 'A'), <-- 4
(2, 'C'),
(2, 'C')
;
输出:
DECLARE @Table1 TABLE
(ID int, STATUS varchar(1));
INSERT INTO @Table1
(ID, STATUS)
VALUES
(1, 'A'),
(1, 'A'),
(1, 'A'),
(1, 'B'),
(1, 'A'),
(2, 'C'),
(2, 'C');
;WITH Tmp
AS
(
SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS RowNumber FROM @Table1
)
SELECT
A.ID ,
A.STATUS ,
ROW_NUMBER() OVER (PARTITION BY A.STATUS, (A.RowNumber - A.RN) ORDER BY (SELECT NULL)) AS RN
FROM
(
Select *, ROW_NUMBER() OVER(PARTITION BY STATUS ORDER BY RowNumber) AS RN from tmp
) A
ORDER BY
A.RowNumber
我想要那样。。上面的结果是我的查询的结果,我想要的是我已经发布了最新的结果。看起来您假设表中的行保持插入的顺序,并将按照该顺序返回,但没有这样的保证。除非您明确地对行进行排序,例如,使用表中的标识列和查询中的order BY
子句,否则您可以按任何顺序返回行。