我在Sql Sever中有一个看起来像这样的表,
Br Type Sales
102 A 20
102 B 10
102 D 8
102 F 12
103 A 18
103 C 7
103 D 15
103 E 3
我想在SQL Server中创建一个新表,它在上面的现有表中添加一列,为每个唯一的Br列提供累计计数,并根据销售列对数据Ascending进行排序。
新表应如下所示,
BrCount Br Type Sales
1 102 D 8
2 102 B 10
3 102 F 12
4 102 A 20
1 103 E 3
2 103 C 7
3 103 D 15
4 103 A 18
我不知道从哪里开始。我想过使用某种循环,在每次迭代时分析一行中包含的Br编号,并使用前一个值+ 1更新BrCount列,或者如果上一行中的Br编号不匹配则只更新1,但我很难找到这种循环的例子。
答案 0 :(得分:1)
您可以使用排名函数ROW_NUMBER()
来执行此操作:
SELECT
ROW_NUMBER() OVER(PARTITION BY br
ORDER BY Sales) AS BRCount,
Br,
Type,
Sales
FROM SalesTable;
这会给你:
| BRCOUNT | BR | TYPE | SALES |
|---------|-----|------|-------|
| 1 | 102 | D | 8 |
| 2 | 102 | B | 10 |
| 3 | 102 | F | 12 |
| 4 | 102 | A | 20 |
| 1 | 103 | E | 3 |
| 2 | 103 | C | 7 |
| 3 | 103 | D | 15 |
| 4 | 103 | A | 18 |
答案 1 :(得分:1)
根据您的示例,您要查找的是使用ranking functions之一的现有表格上的查询:
SELECT
Rank() OVER(PARTITION BY br BY Sales) AS BRCount,
Br,
Type,
Sales
FROM MyTable
您可能希望使用RANK
,DENSE_RANK
或ROW_NUMBER
。您可以阅读更多关于this优秀SO线程的差异。