Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在VARCHAR列上进行分区_Sql_Sql Server_Tsql - Fatal编程技术网

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
子句,否则您可以按任何顺序返回行。