2015-06-29 65 views
0

我试图设置一个查询,在两次之间执行DATEDIFF,这取决于某列中最后一个唯一值的存在时间。数据结构如下:根据选择选择最后一个独特值和TIMEDIFF?

row ticket_id create_time  change_time owner_id  queue_id 
1   11234 5/12/2014 13:47 5/12/2014 13:47  2  4 
2   11234 5/12/2014 13:47 5/12/2014 13:47  2  4 
3   11234 5/12/2014 13:47 5/12/2014 13:47  8  11 
4   11234 5/12/2014 13:47 5/12/2014 13:47  8  11 
5   11234 5/12/2014 14:02 5/12/2014 14:02  3  9 
6   11234 5/12/2014 14:10 5/12/2014 14:10  17  5 
7   11234 5/14/2014 12:00 5/14/2014 12:00  17  5 
8   11234 5/15/2014 12:27 5/15/2014 12:27  17  5 

基本上,我想为第6行和第8行之间的“change_time”列做一个datediff。我想在每个ticket_id的owner_id列或queue_id列中选择最终的不同数字,并计算更改时间的差异。有没有一种方法可以使用MySQL进行设置?使用MAX()函数将不起作用,因为最高和第二高的更改时间并不总是与最终队列ID或所有者ID相关联。我知道在SAS中可以使用do循环和counter + 1的组合来执行类似的操作,但是SQL可能是这样的情况吗?

回答

0

使用子查询为每个ticket_id获取最后的owner_id,使用SQL Select only rows with Max Value on a Column中的技术之一。将它与表格联系起来,以获取此票证和所有者的第一个和最后一个更改时间。

SELECT t1.ticket_id, DATEDIFF(MAX(t1.change_time), MIN(t1.change_time)) AS diff 
FROM YourTable AS t1 
JOIN (SELECT a.ticket_id, a.owner_id AS last_owner 
     FROM YourTable AS a 
     JOIN (SELECT ticket_id, MAX(row) AS max_row 
      FROM YourTable 
      GROUP BY ticket_id) AS b 
     ON a.ticket_id = b.ticket_id AND a.owner_id = b.max_row) AS t2 
ON t1.ticket_id = t2.ticket_id AND t1.owner_id = t2.last_owner 
GROUP BY t1.ticket_id 

DEMO

+0

谢谢! 但我相信MAX()函数将采用列中的最高值,而不是最终的不同值。在队列上面的表中,它将使用队列ID为11的DATEDIFF()而不是5,这正是我所需要的。任何其他想法/建议? – tylerpol

+0

显然我误解了,因为我认为“最终的不同价值”意味着最高的价值。 – Barmar