两个相似值之间的时差

时间:2013-06-17 16:14:07

标签: mysql

我想在我的数据库中找到两个函数名之间的时差。数据库看起来像这样:

enter image description here

我想要做的是找到两个具有相同名称的连续函数名之间的时差。例如,输出将是行号“2”和行号“3”的“getPrice”,然后是行“3”和行“5”的“getPrice”的时间差,依此类推所有其他时间和所有其他时间功能名称。请帮帮我,非常感谢!

我试过

SELECT a.lid, a.date, (b.date-a.date) as timeDifference 
FROM myTable a 
INNER JOIN myTable b ON b.lid = (a.lid+1) 
ORDER BY a.lid ASC;

问题是,它给出了任何连续函数名称的时间差,即使它们不相同!

@tombom

我有一个用于测试的表,并且具有与我之前提供的示例不同的变量名。表格如下:

enter image description here

并且在应用代码之后(当然更改变量名称以匹配此表)输出如下所示:

enter image description here

正如您所看到的,“getTax”从“getPrice”中减去,尽管它们不同。我怎么解决这个问题??非常感谢。

我正在尝试构建的架构是:

 CREATE  TABLE `test` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `nserviceName` VARCHAR(45) NULL ,
  `functionName` VARCHAR(45) NULL ,
  `time` TIMESTAMP NULL ,
  `tps` INT NULL ,
  `clientID` INT NULL ,
  PRIMARY KEY (`id`) );

,插入内容为:

INSERT INTO `test` (`id`, `nserviceName`, `functionName`, `time`, `tps`, `clientID`) VALUES ('1', 'X1', 'getPrice', '2013-05-23 00:36:08', '22', '0');
INSERT INTO `test` (`id`, `nserviceName`, `functionName`, `time`, `tps`, `clientID`) VALUES ('2', 'X2', 'getTax', '2013-05-23 00:38:00', '33', '0');
INSERT INTO `test` (`id`, `nserviceName`, `functionName`, `time`, `tps`, `clientID`) VALUES ('3', 'X1', 'getPrice', '2013-05-23 00:35:00', '12', '0');
INSERT INTO `test` (`id`, `nserviceName`, `functionName`, `time`, `tps`, `clientID`) VALUES ('4', 'X1', 'getPrice', '2013-05-23 00:35:00', '11', '0');
INSERT INTO `test` (`id`, `nserviceName`, `functionName`, `time`, `tps`, `clientID`) VALUES ('5', 'X2', 'getTax', '2013-05-23 00:35:00', '88', '0');
INSERT INTO `test` (`id`, `nserviceName`, `functionName`, `time`, `tps`, `clientID`) VALUES ('6', 'X1', 'getPrice', '2013-05-23 00:35:00', '33', '0');

感谢。

@tombom 我想在表上执行的操作如下图所示: enter image description here

我从第一个记录X1 getPrice开始,它之前没有记录。所以不需要操作。然后检查第二个getTax之前没有getPrice,它们不相同,所以不再执行任何操作。然后数字3 getPrice之前有getTax,所以它忽略它并在上面检查getTax以找到getPrice,它将执行getPrice(#3)和getPrice(#1)之间的时差。第4行的下一个getPrice将检查它上面的行,并且发现它上面的行是getPrice,因此将找到getPrice *(#4)和getPrice(#3)之间的时间差。然后第5行的getTax将检查它上面的行,直到它找到类似于第2行的functionName(getTax)。然后将找到第5行的getTax和第2行的getTax之间的时差。

非常感谢..

1 个答案:

答案 0 :(得分:2)

请试试这个:

SELECT lid, `date`, serviceName, functionName, responseTime, sid, timeDifference FROM (
SELECT
IF(@prevFname = functionName, SEC_TO_TIME(TIMESTAMPDIFF(SECOND, `date`, @prevDate)), 'functionName differs') AS timeDifference,
@prevFname := functionName AS a,
@prevDate := `date` AS b,
yt.*
FROM
yourTable yt
, (SELECT @prevFname:=NULL, @prevDate:=NULL) vars
ORDER BY functionName, `date`
) subquery_alias

我喜欢在这种情况下使用用户定义的变量,因为我在性能方面取得了惊人的经验,因为不需要自我加入。

另请注意,我使用timestampdiff函数和sec_to_time来优化输出。 Timestampdiff是减去不同日期(+次)的正确方法。唯一的缺点是,sec_to_time只允许范围从'00:00:00'到'23:59:59'。如果这可能导致问题,请再次删除该功能。在this site上阅读有关这两个函数的更多信息。

更新(不太复杂):

SELECT lid, `date`, serviceName, functionName, responseTime, sid, timeDifference FROM (
SELECT
SEC_TO_TIME(TIMESTAMPDIFF(SECOND, @prevDate, `date`)) AS timeDifference,
@prevDate := `date` AS b,
yt.*
FROM
yourTable yt
, (SELECT @prevDate:=NULL) vars
ORDER BY lid
) subquery_alias

更新2:

当functionName与前一个不同时,这个会将时间差重置为00:00:00

SELECT * /*choose here only the columns you need*/ FROM (
SELECT
IF(@prevFunction = functionName, SEC_TO_TIME(TIMESTAMPDIFF(SECOND, @prevDate, `time`)), '00:00:00') AS timeDifference,
@prevFunction := functionName AS a,
@prevDate := `time` AS b,
yt.*
FROM
test yt
, (SELECT @prevDate:=NULL, @prevFunction:=NULL) vars
ORDER BY id
) subquery_alias

更新3:

好吧,这是一个多么艰难的出生。只是一个小小的调整。

SELECT * /*choose here only the columns you need*/ FROM (
SELECT
IF(@prevFunction = functionName, SEC_TO_TIME(TIMESTAMPDIFF(SECOND, @prevDate, `time`)), '00:00:00') AS timeDifference,
@prevFunction := functionName AS a,
@prevDate := `time` AS b,
yt.*
FROM
test yt
, (SELECT @prevDate:=NULL, @prevFunction:=NULL) vars
ORDER BY functionName, id#, `time`
) subquery_alias
ORDER BY id

我在子查询中按函数名称和id(或者您喜欢的时间)进行排序,执行所有计算,然后在外部查询中再次按id对其进行排序。就是这样。