我有像
这样的表格Name
A
B
B
C
C
C
A
A
B
B
我需要Query来返回输出,如
Name count
A 1
B 2
C 3
A 2
B 2
我尝试使用rank(),dense_Rank()。但我无法获得输出
答案 0 :(得分:1)
在我看来,这个问题不是要投票,它很有意思,无论如何我们都可以继续解决。
为了对名称进行分组并获取每个分隔组中的名称计数,带有group by或window函数的简单计数函数无法解决您的问题,我更喜欢使用两个辅助字段,一个用于行号,另一个包含组号的值,如果它与当前名称不同,您将遍历您的表并增加组字段的值:
假设你的桌子是:
create table tblN (Name varchar(10))
insert into tblN values
('A'),
('B'),
('B'),
('C'),
('C'),
('C'),
('A'),
('A'),
('B'),
('B');
以下查询是针对上述说明的:
;with cte1 as(
select 1 gp,name -- add gp for group number
from tblN
),
cte2 as(
select gp,name,
row_number() over(order by gp) rn --add rn for evaluating groups
from cte1
),
cte3 as(
select gp,name,rn from cte2 where rn=1
union all
select case --evaluate groups
when c2.name=c3.name then c3.gp
else c3.gp+1
end gp,
c2.name,c2.rn
from cte3 c3
join cte2 c2 on c3.rn+1=c2.rn
)
select gp,name from cte3 --[1]
结果:
gp name
1 A
2 B
2 B
3 C
3 C
3 C
4 A
4 A
5 B
5 B
现在在上面的查询而不是行[1]中使用下面的查询:
select name , count from(
select top 1000 gp,name,
count(name) count
from cte3
group by gp,name
order by gp) q
结果:
name count
A 1
B 2
C 3
A 2
B 2
答案 1 :(得分:-1)
您可以通过以下查询轻松达到您的要求
SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) AS COUNT,NAME FROM TABLENAME )T ORDER BY 1,2