2015-01-15 5 views
0

Мне нужно подсчитать изменения в назначенной группе в билете. Проблема заключается в том, что мой журнал также учитывает изменения в цессионарии, которые находятся в одной группе.Изменения счетчика SQL в столбце

Вот некоторые выборочные данные

ticket_id | assigned_group | assignee | date 
---------------------------------------------------- 
1001  | group A   | john  | 1-1-15 
1001  | group A   | michael | 1-2-15 
1001  | group A   | jacob  | 1-3-15 
1001  | group B   | eddie  | 1-4-15 
1002  | group A   | john  | 1-1-15 
1002  | group B   | eddie  | 1-2-15 
1002  | group A   | john  | 1-3-15 
1002  | group B   | eddie  | 1-4-15 
1002  | group A   | john  | 1-5-15 

мне это нужно, чтобы вернуть

ticket_id | count 
-------------------- 
10001  | 2 
10002  | 4 

Мой запрос как этот

select ticket_id, assigned_group, count(*) from mytable group by ticket_id, assigned_group 

Но это дает мне

ticket_id | count 
-------------------- 
10001  | 4 
10002  | 5 

редактировать:

Кроме того, если я использую

select ticket_id, count(Distinct assigned_group) as [Count] from mytable group by ticket_id 

я только получаю

ticket_id | count 
-------------------- 
10001  | 2 
10002  | 2 

Любые советы?

+0

как вы считаете билет, который изменить из группы А в группу B для группы А в группу В? было бы 2 или 3? – Jayvee

+0

@Jayvee Это будет 3. Каждое изменение считается даже если оно ушло в эту группу раньше. – Hoopdady

+0

не должен бить 10001 счет 1 – Santhosh

ответ

0

попробовать это ..

with temp as 
(
select ticket_id, assigned_group, count(*) as count,date from mytable group by ticket_id, assigned_group,date 
) 

select ticket_id, count from temp 
1

Используйте Distinct Count, чтобы получить результат

select ticket_id, count(Distinct assigned_group) as [Count] 
from mytable 
group by ticket_id 
+0

Это не сработает, потому что, если я добавлю еще одну запись для 1002, переназначая ее в группу B, она останется только 2. – Hoopdady

0

Вы можете использовать row_number() функцию, чтобы посмотреть на значение следующей записи в.

with tbl as (select *, row_number() over(partition by ticket_id order by 1) from table) 

select a.ticket_id, a.assigned_group, a.assignee_name, a.date, 
count(case when a.assigned_group <> b.assigned_group then 1 else 0 end) as No_of_change 
from tbl as a 
left join tbl as b 
on a.rn = b.rn + 1 
0

Если вы используете SQL Server 2012, то вы можете использовать функцию LAG, чтобы легко определить предыдущую назначенную группу. Тогда, если предыдущая назначена группа отличается от текущей назначенной группы, вы можете увеличивать количество, как показано ниже:

WITH previous_groups AS 
(
    SELECT 
    ticket_id, 
    assign_date, 
    assigned_group, 
    LAG(assigned_group, 1, NULL) OVER (PARTITION BY ticket_id ORDER BY assign_date) AS prev_assign_group 
    FROM mytable 
) 
SELECT 
    ticket_id, 
    SUM(CASE 
     WHEN assigned_group <> prev_assign_group THEN 1 
     ELSE 0 
    END) AS count 
FROM previous_groups 
WHERE prev_assign_group IS NOT NULL 
GROUP BY ticket_id 
ORDER BY ticket_id; 

Если вы используете 2008 или более ранние версии SQL Server, то вам нужен дополнительный шаг, чтобы определить, предыдущая заданная группа, как показано ниже:

WITH previous_assign_dates AS 
(
    SELECT 
    mt1.ticket_id, 
    mt1.assign_date, 
    MAX(mt2.assign_date) AS prev_assign_date 
    FROM mytable mt1 
    LEFT JOIN mytable mt2 
    ON mt1.ticket_id = mt2.ticket_id 
    AND mt2.assign_date < mt1.assign_date 
    GROUP BY 
    mt1.ticket_id, 
    mt1.assign_date 
), 
previous_groups AS 
(
    SELECT 
     mt1.*, 
     mt2.assigned_group AS prev_assign_group 
    FROM mytable mt1 
    INNER JOIN previous_assign_dates pad 
    ON mt1.ticket_id = pad.ticket_id 
    AND mt1.assign_date = pad.assign_date 
    LEFT JOIN mytable mt2 
    ON pad.ticket_id = mt2.ticket_id 
    AND pad.prev_assign_date = mt2.assign_date 
) 
SELECT 
    ticket_id, 
    SUM(CASE 
     WHEN assigned_group <> prev_assign_group THEN 1 
     ELSE 0 
    END) AS count 
FROM previous_groups 
WHERE prev_assign_group IS NOT NULL 
GROUP BY ticket_id 
ORDER BY ticket_id; 

SQL Fiddle demo

Ссылка: The LAG function on MSDN

0

Добавление порядковый номер в билете, то автообъединение где группа разные и последовательные порядковые, должны работать:

SELECT t1.ticket_id, COUNT(*) FROM 
(SELECT *, ROW_NUMBER() OVER(PARTITION BY ticket_id ORDER BY date) ordinal 
FROM mytable) t1 
JOIN 
(SELECT *, ROW_NUMBER() OVER(PARTITION BY ticket_id ORDER BY date) ordinal FROM nytable) t2 
ON t1.ticket_id=t2.ticket_id AND t1.assigned_group<>t2.assigned_group AND t1.ordinal+1=t2.ordinal 
GROUP BY t1.ticket_id 
Смежные вопросы