根据条件对数据进行分组,然后依次排序

时间:2014-03-03 16:50:50

标签: sql sql-server

该表有两列,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/)可以解决它。

提前致谢

3 个答案:

答案 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