Sql 更改编号列
我有姓名和薪资,但在本例中我需要CHANGEGROUP: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
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