Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 更改编号列_Sql_Sql Server_Sql Server 2005_Group By_Gaps And Islands - Fatal编程技术网

Sql 更改编号列

Sql 更改编号列,sql,sql-server,sql-server-2005,group-by,gaps-and-islands,Sql,Sql Server,Sql Server 2005,Group By,Gaps And Islands,我有姓名和薪资,但在本例中我需要CHANGEGROUP: NAME PAY DATE CHANGEGROUP Sally 12 10/01/2011 1 Sally 12 10/01/2011 1 Sally 12 11/02/2011 1 Sally 12 11/02/2011 1 Sally 12 12/01/2012 1 Sally 13 04/23/2013 2 Sally 12 04/24/2013 3 Sally

我有姓名和薪资,但在本例中我需要CHANGEGROUP:

NAME   PAY  DATE    CHANGEGROUP
Sally   12  10/01/2011  1
Sally   12  10/01/2011  1
Sally   12  11/02/2011  1
Sally   12  11/02/2011  1
Sally   12  12/01/2012  1
Sally   13  04/23/2013  2
Sally   12  04/24/2013  3
Sally   10  05/01/2013  4
Sally   10  10/01/2014  4

我尝试了
RANK()
densite\u RANK()
,但他们根据值进行分组-因为工资下降,这会打乱我的分组。我看到了,但它与SQL 2005的旧版本不兼容这是一个缺口和孤岛问题

一种方法


您似乎假设了一些不存在的默认行顺序。我按日期列对行进行排序,但我不想做太多。这个数据库很糟糕,我对此无能为力。我不希望人们因为这个问题而撕毁我的新版本,而忽略我的问题>\u这个解决方案似乎有缺陷。如果我使用此数据集,我会将Pay 10和Pay 12分组到同一个变更组中:(在表1中插入数值('Sally',10',08/28/2012'),('Sally',12',09/06/2012'),('Sally',10',05/17/2014'),('Sally',12',01/2015'),('Sally',13',01/01/2016'));结果…姓名支付日期更改组Sally 10 2012-08-28 1 Sally 10 2014-05-17 2 Sally 12 2012-09-06 2 Sally 12 2015-01-01 3 Sally 13 2016-01-01 4抱歉,注释似乎不支持换行符。发布另一个问题,详细说明您的表结构、示例数据和您使用的查询。
WITH T1
     AS (SELECT *,
                ROW_NUMBER()
                  OVER (
                    PARTITION BY NAME
                    ORDER BY DATE) - ROW_NUMBER()
                                       OVER (
                                         PARTITION BY NAME, [PAY]
                                         ORDER BY DATE) AS Grp
         FROM   Table1),
     T2
     AS (SELECT *,
                MIN(DATE)
                  OVER (
                    PARTITION BY NAME, Grp) AS MinDate
         FROM   T1)
SELECT [NAME],
       [PAY],
       [DATE],
       DENSE_RANK()
         OVER (
           PARTITION BY NAME
           ORDER BY MinDate) AS CHANGEGROUP
FROM   T2
ORDER  BY NAME,
          MinDate