直到差异行来的行之间的差异

时间:2017-01-12 06:34:39

标签: mysql

我有一张像

这样的表格
tctid   owner       Mindate
1165267 Unassigned  2016-11-01 16:53:19
1165267 John        2016-11-02 10:54:06
1165267 Harry       2016-11-02 17:02:38
1181499 Priority    2016-11-02 18:28:18
1181499 Abraham     2016-11-02 18:36:10
1181499 John        2016-11-10 01:01:50
1181499 Abdullah    2016-11-13 11:03:36
1181499 Harry       2016-11-17 19:25:31
1183682 Unassigned  2016-11-03 19:07:00
1183682 Harry       2016-11-03 19:09:57
1183682 John        2016-11-03 19:20:39
1183682 Harry       2016-11-08 13:15:57
1183682 John        2016-11-08 14:08:46
1183682 David       2016-11-19 09:45:31
1183682 IT          2016-12-13 22:06:50
1183682 John        2016-12-14 20:19:37
1183682 Harry       2016-12-14 22:12:03

现在我想找到行之间的差异,直到下一个唯一的故障单ID出现。我正在寻找这个出局

tctid   owner         Mindate              Diff in Day:Hour:Min
1165267 Unassigned    2016-11-01 16:53:19   0:18:0
1165267 John          2016-11-02 10:54:06   0:6:8
1165267 Harry         2016-11-02 17:02:38   For Last entry no calculation 
1181499 Priority      2016-11-02 18:28:18   0:0:7
1181499 Abraham       2016-11-02 18:36:10   7:6:25
1181499 John          2016-11-10 01:01:50   3:10:1
1181499 Abdullah      2016-11-13 11:03:36   4:8:21
1181499 Harry         2016-11-17 19:25:31   For Last entry no calculation 
1183682 Unassigned    2016-11-03 19:07:00   0:0:2
1183682 Harry         2016-11-03 19:09:57   0:0:10
1183682 John          2016-11-03 19:20:39   4:17:55
1183682 Harry         2016-11-08 13:15:57   0:0:52
1183682 John          2016-11-08 14:08:46   10:19:36
1183682 David         2016-11-19 09:45:31   24:12:21
1183682 IT            2016-12-13 22:06:50   0:22:12
1183682 John          2016-12-14 20:19:37   0:1:52
1183682 Harry         2016-12-14 22:12:03   For Last entry no calculation 

并且对于同一张票的最后一个条目,不需要任何差异。

这里是小提琴http://sqlfiddle.com/#!9/30a42/2

3 个答案:

答案 0 :(得分:2)

您是否正在寻找与之前的机票相比的当前时差,您想要写入当前的这种差异?尝试使用TIMEDIFF

在每个新插入中选择上一个ticketid的时间数据并使用TIMEDIFF,此值保存到插入的(新值)和列名previsous_diff或类似的

如果您在创建新故障单时添加时间差,那么前一故障单过程的时间差将会很复杂,问题是是否有必要?

答案 1 :(得分:2)

抱歉,在MySQL中你必须在Select Query中使用CASE(而不是IF)(我误认为是Oracle)

select t.*, (
case when((
select count(t2.tctid) 
from tickets t2 
where t2.tctid = t.tctid and t.mindate < t2.mindate 
order by t2.tctid, t2.mindate ASC) > 1) 
         THEN ( select TIMEDIFF(t2.mindate,t.mindate) 
               from tickets t2 
               where t2.tctid = t.tctid and t.mindate < t2.mindate 
               order by t2.tctid, t2.mindate ASC LIMIT 1 ) 
ELSE 'For Last entry no calculation' END ) as diff
from tickets t order by t.tctid, t.mindate ASC;

好的,我在我的数据库中尝试了,但你的插入时间格式无效(时间有相同的零),请尝试使用此代码,并根据需要进行更改。对于比较日期,如果此版本无法正常工作,请使用!=或某些内容与MySql中的日期进行比较。

答案 2 :(得分:1)

如果您需要编辑现有数据,或者只计算它直接使用hava 2选项:

  1. 使用mysql(DR响应缓慢)
  2. 使用PHP
  3. 对于MySql使用类似的东西:

    select 
    t.*,
     (
       select 
        IF count(t2.tctid) > 1 THEN
          (
            // You must select 1 value from previous select query
            select TIMEDIFF(t2.mindate,t.mindate)
          )
        ELSE
         'For Last entry no calculation '
        END IF 
       from tickets t2 
       where t2.tctid=t.tctid and t.mindate <> t2.mindate 
       order by t2.tctid, t2.mindate ASC
     ) 
    from tickets t order by t.tctid, t.mindate ASC;