按值的连续出现进行SQL分组

3
我有一个包含两列的表格,如下所示:
ID     |     Dept 

1      |    A    
2      |    A
3      |    B
4      |    B
5      |    B
6      |    A

我想进行一次计数,使输出结果看起来像下面的表格。

Dept   |     Count

A      |    2    
B      |    3
A      |    1

Thanks for your help in advance!


1
我不明白,为什么你要为部门A创建两条记录?表中已经有3条部门A的记录了。 - HoneyBadger
2
你目前的尝试是什么? - Goose
你能澄清一下输出是否正确吗?也就是说,A应该只有一个计数为3的结果。你提到了COUNT,这有点误导人。 - Dr Schizo
4个回答

5
略有不同于迈克尔的方法,但是结果相同:
with cte1 as (
  select   id,
           dept,
           row_number() over (partition by dept order by id) - 
             row_number() over (order by id) group_num
  from     test),
cte2 as (
  select   dept,
           group_num,
           count(*) c_star,
           max(id) max_id
  from     cte1
  group by dept,
           group_num)
select   dept,
         c_star
from     cte2
order by max_id;

http://sqlfiddle.com/#!4/ff747/1


我更喜欢你的方法,因为它使用了 row_number() over (order by id) 而不仅仅是 id,这意味着如果 ID 不是连续的或非整数,它更加健壮。 - Vincent Savard
干杯 -- 是的,我也考虑过这个可能性。 - David Aldridge

1

从您的示例中,看起来您想要为每个部门计算连续记录。

您可以通过组合行号和排序 ID 来实现此目的。

create table tblDept (
    id int not null, 
    dept varchar(50)
);

insert into tblDept values (1, 'A');
insert into tblDept values (2, 'A');
insert into tblDept values (3, 'B');
insert into tblDept values (4, 'B');
insert into tblDept values (5, 'B');
insert into tblDept values (6, 'A');

with orderedDepts as (
  select
    dept,
    id,
    row_number() over (partition by dept order by id) - 
      row_number() over (order by id) as rn
  from tblDept
)
select
  dept,
  count(*) as num
from orderedDepts
group by
  dept,
  rn
 order by
   max(id)

输出结果为:
+------+-----+
| DEPT | NUM |
+------+-----+
| A    |   2 |
| B    |   3 |
| A    |   1 |
+------+-----+

SQL Fiddle


请注意,如果具有相同部门的两个连续 ID 之间存在间隔,则此方法将无效。 - Deep
1
@DeepakPawar 更新了答案以涵盖这种情况...我的最初假设可能是错误的。 - Michael Fredrickson

0

使用SQL无法做到这一点。Count函数计算不同项的数量,因此在您的情况下,count函数将为AB分别计算数量。

您只能按表中的值进行计数/分组,而不能按行的顺序进行计数/分组。如果您没有使用order by语句,则在SQL中无法保证行的顺序。


在这种情况下,顺序可能是ID。我认为这并不是不可能的,但似乎相当不方便。 - Vincent Savard
他的问题是关于count()函数以及如何获得他想要的结果,但他无法做到。 - mikeb
问题是“如何获得这个输出”,他认为可以使用COUNT()轻松获得输出。在SQL中实现这个结果本身可能并不难。 - Vincent Savard

-2

针对此项运行查询:

SELECT Dept, count(*) FROM table_name group By Dept

2
你能否再检查一下他的预期输出? - koushik veldanda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接