2015-01-15 47 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

你怎么算,从A组变为B组门票将A组分配给B组?它会是2还是3? – Jayvee 2015-01-15 17:34:58

+0

@Jayvee那将是3.每个变化都会计数,即使它之前已经到了那个组。 – Hoopdady 2015-01-15 18:28:02

+0

不应该票10001有计数1 – Santhosh 2015-01-15 18:32:27

回答

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 2015-01-15 18:08:53

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; 

如果您使用的是SQL Server 2008或更早版本,那么你就需要一个额外的步骤,以确定先前分配的组,如下:

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