查询有效,但我需要先执行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
答案 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