2015-09-14 3 views
3

У меня есть ниже таблицы с 2 колонкамиSQL Группировка последовательными вхождений значения

ID  |  Dept 

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

Я хочу сделать подсчет таким образом, что вывод должен выглядеть, как в таблице ниже.

Dept |  Count 

A  | 2  
B  | 3 
A  | 1 

Благодарим за помощь!

+1

Я не понимаю, зачем вам две записи для департамента A? В отделе A есть 3 записи в таблице. – HoneyBadger

+2

Каковы ваши попытки до сих пор? – Goose

+0

Можете ли вы уточнить вывод правильно, т. Е. Должен ли быть только один результат для A, который должен иметь счет 3. Вы упоминаете COUNT, который немного вводит в заблуждение. –

ответ

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

+0

Я предпочитаю ваш метод, потому что он использует 'row_number() over (order by id)' вместо просто 'id', что означает, что он более надежный, если идентификаторы не являются последовательными или нецелыми. –

+0

Приветствия - Да, я думал об этом как о возможности. –

+0

Да, это был бы лучший выбор ... –

-2

запустить этот запрос для этого:

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

Можете ли вы когда-нибудь проверить ожидаемый результат его работы –

0

Вы не можете сделать это с помощью SQL. Счет подсчитывает разные элементы, поэтому счет в вашем случае даст вам счет A и счет B.

Вы можете только считать/группировать значения в таблице, а не порядком строк. Заказ не гарантируется в SQL, если вы все равно не используете order by.

+0

Приказ в этом случае был бы id, возможно. Я не думаю, что это невозможно, но это кажется довольно неудобным. –

+0

Его вопрос - функция count() и как получить то, что он хочет. Он не может. – mikeb

+0

Вопрос: «Как вы можете получить этот результат», и он думал, что может использовать 'COUNT()', чтобы легко получить результат. Результат сам по себе, вероятно, невозможно достичь в SQL. –

1

Из вашего примера, похоже, вы хотите считать последовательные записи для каждого отдела.

Вы можете сделать это, объединив номер строки и идентификатор заказа.

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

+0

Следует отметить, что это не будет работать, если есть пробел между двумя последовательными идентификаторами с тем же департаментом –

+1

@DeepakPawar Обновлен ответ, чтобы охватить этот случай ... мое первоначальное предположение, вероятно, было неправильным. –