需要在查询运行之前执行订单

时间:2017-08-01 21:47:49

标签: mysql

查询有效,但我需要先执行order by g1.caller , g1.created_on。原因是我需要连续比较呼叫者,所以我可以看看他们是否需要多次呼叫才能解决问题。

SELECT 
    g1.caller,
    g1.created_on,
    g1.config_item,
    g2.caller,
    g2.created_on,
    g2.config_item
FROM
    smp_newcall g1
        INNER JOIN
    smp_newcall g2 ON g2.id = g1.id + 1    
WHERE
    g1.caller = g2.caller and    
    g1.config_item = g2.config_item and
    g1.created_on between '2017-07-01' and '2017-07-31'           

如果您可以让TIMESTAMPDIFF(HOUR,date(g1.created_on),date(g2.created_on)) > 48在where语句中工作,则可获得积分。目前它由于某种原因返回0。该列设置为datetime。

预期的返回数据应该是任何调用者,在48小时内为同一个config_item记录多个票据。

Row 1: John Smith, 2017-07-01 10:00:00, Outlook, John Smith, 2017-07-01 11:00:00, Outlook
Row 2: John Smith, 2017-07-02 11:00:00, Outlook, John Smith, 2017-07-03 11:00:00, Outlook

一旦我完成了验证,它就会返回计数。现在我想看到是的,同一个人在48小时内完成同样的事情。

SQL小提琴http://sqlfiddle.com/#!9/0d696/1 既然我知道数据已经排序,我还有另外一个问题。缺少2次退货。它还应该返回:

john doe 2017-07-01T11:00:00Z Windows 7 john doe 2017-07-02T10:00:00Z Windows 7 
john smith 2017-07-01T11:00:00Z Outlook  john smith 2017-07-02T10:00:00Z Outlook 

1 个答案:

答案 0 :(得分:0)

IMO无需预先排序。相邻行之间的比较在程序中比在查询中更容易。甚至你可能会使用用户定义的变量,但似乎你可以从这里开始一种新的方法:

SELECT g1.caller
     , g1.config_item
     , count(1)
  FROM smp_newcall g1
  WHERE g1.created_on between '2017-07-01' and '2017-07-31'
    AND exists( SELECT 1
                  FROM smp_newcall g2
                  WHERE g2.caller = g1.caller
                    AND g2.config_item = g1.config_item
                    AND g2.created_on >= g1.created_on -interval 48 hour 
                    AND g2.created_on < g1.created_on
              )
  GROUP BY g1.caller
         , g1.config_item