我想在我的数据库中找到两个函数名之间的时差。数据库看起来像这样:
我想要做的是找到两个具有相同名称的连续函数名之间的时差。例如,输出将是行号“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
我有一个用于测试的表,并且具有与我之前提供的示例不同的变量名。表格如下:
并且在应用代码之后(当然更改变量名称以匹配此表)输出如下所示:
正如您所看到的,“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 我想在表上执行的操作如下图所示:
我从第一个记录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之间的时差。
非常感谢..
答案 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对其进行排序。就是这样。