该表有两列,ID是PK,另一列是Type,示例数据如下所示。
| ID | Type |
| 1 | 0 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
| 5 | 0 |
| 6 | 1 |
我试图将样本数据分组到以下所需的输出中。 1.所需的输出按ID排序。 2.类别基于以下逻辑计算,具有相同类型的连续记录将被分配相同的类别,而具有不同类型的记录将按类别增加1.
| ID | Type |Category |
| 1 | 0 | 1 |
| 2 | 0 | 1 |
| 3 | 1 | 2 |
| 4 | 1 | 2 |
| 5 | 0 | 3 |
| 6 | 1 | 4 |
是否可以在SQL Server 2008和2012中执行此操作? 我发现这个(http://explainextended.com/2011/02/18/things-sql-needs-series/)可以解决它。
提前致谢
答案 0 :(得分:0)
您可以尝试(所有sql中的sql查询中的映射)
select PK, ID, Category
from (select PK, ID, "1" as 'Category' from Table1 where ID = 0 and PK < 3;
UNION
select PK, ID, "2" as 'Category' from Table1 where ID = 1 and PK < 5
UNION
select PK, ID, "3" as 'Category' from Table1 where PK = 5
UNION
select PK, ID, "4" as 'Category' from Table1 where PK = 6
}
order by PK
答案 1 :(得分:0)
可能但有点奇怪,因为Category的值取决于以前的数据条目。
查看ROW_NUMBER()和DENSE_RANK()函数,它们将为您编写部分编号。我可能会选择一个派生表来排序您想要的方式,并使用row_number()
对它们进行排序,将其重新连接到自身并将行与之前的行进行比较,以查看Type
是否匹配以及Id = Id-1
,然后根据它重新排名。
答案 2 :(得分:0)
你可能正在寻找
DECLARE @amount TABLE (ID INT,TYPE INT)
INSERT INTo @amount (ID,TYPE)VALUES (1,0)
INSERT INTo @amount (ID,TYPE)VALUES (2,0)
INSERT INTo @amount (ID,TYPE)VALUES (3,1)
INSERT INTo @amount (ID,TYPE)VALUES (4,1)
INSERT INTo @amount (ID,TYPE)VALUES (5,0)
INSERT INTo @amount (ID,TYPE)VALUES (6,1)
INSERT INTo @amount (ID,TYPE)VALUES (7,0)
select ID,TYPE,DENSE_RANK()OVER (PARTITION BY TYPE ORDER BY ID ASC ) AS RN from @amount