我正在努力处理我正在尝试编写的棘手的SQL查询.看看下表:
+---+---+ | A | B | +---+---+ | 1 | 2 | | 1 | 3 | | 2 | 2 | | 2 | 3 | | 2 | 4 | | 3 | 2 | | 3 | 3 | | 4 | 2 | | 4 | 3 | | 4 | 4 | +---+---+
现在,从这个表中,我基本上想要一个包含完全相同的B组的所有As的列表,并为每个集合提供递增ID.
因此,上述输出设置为:
+---+----+ | A | ID | +---+----+ | 1 | 1 | | 3 | 1 | | 2 | 2 | | 4 | 2 | +---+----+
谢谢.
编辑:如果有帮助,我有一个列表,列出了另一个表中可能出现的B的所有不同值.
编辑:非常感谢所有创新的答案.能够学到很多东西.
解决方法
这是解决你的棘手选择的数学技巧:
with pow as(select *,b * power(10,row_number() over(partition by a order by b)) as rn from t) select a,dense_rank() over( order by sum(rn)) as rn from pow group by a order by rn,a
小提琴http://sqlfiddle.com/#!3/6b98d/11
这当然只适用于有限的不同计数,因为你会溢出.以下是字符串的更通用的解决方案:
select a,dense_rank() over(order by (select '.' + cast(b as varchar(max)) from t t2 where t1.a = t2.a order by b for xml path(''))) rn from t t1 group by a order by rn,a