2014-06-07 64 views
1

我正在使用从其他人继承的脚本处理Ingres数据库。我需要更改脚本以提取最新的start_time和end_time事件的action_times,以及两者之间的差异。在DB的样品下面列出Ingres SQL,根据另一列的值查找一列的最大值

id_num | version | action_id | action_time 
---------------------------------------------------------------------------- 
1   2   start_time  2014-05-26 14:58:14 
1   2   end_time  2014-05-26 14:58:16 
1   4   start_time  2014-05-27 10:10:57 
1   4   end_time  2014-05-27 10:10:11 

到目前为止,我想出是:

SELECT max(a.action_time) as BIG, max(b.action_time) as SMALL, max(a.action_time) - max(b.action_time) as DIFF 
FROM table1 as a, table1 as b, 
WHERE a.id_num = '1' AND a.action_id = 'end_time' AND b.id_num = '1' AND b.action_id = 'start_time' 

但结果出来如下:

BIG       SMALL     DIFF 
---------------------------------------------------------------------------- 
2014-05-27 10:10:11   2014-05-27 10:10:57  null  

道歉如果这样的问题已经得到解答(我确信它可能有),但我已经花了几天的时间来查看各种论坛,我找不到类似的例子,可能我是如何解释搜索条件的。任何帮助将不胜感激,我敢肯定,我会在大学里涵盖这样的东西,但那是几年前,我的SQL现在有点生疏。提前致谢!

编辑:所以一些研究,我想出了下面这将在DB GUI工作后:如果您想计算最大(a.acction_time)之间的差值

SELECT ingresdate(varchar(max(a.action_time))) as BIG, ingresdate(varchar(max(b.action_time))) as SMALL, date_part('secs',ingresdate(varchar(max(a.action_time))) - ingresdate(varchar(max(b.action_time)))) as DIFF 
FROM table1 as a, table1 as b, 
WHERE a.id_num = '1' AND a.action_id = 'end_time' AND b.id_num = '1' AND b.action_id = 'start_time' 
+0

该文档请参阅ms建议这应该是有效的。什么版本的Ingres?什么是基础类型?你确定'action_time'不是字符(已批准,我希望在这种情况下会出现错误...)?如果您尝试投射/添加间隔会发生什么?你想要什么样的结果差异?我建议将它作为一对子查询来完成 - 因为它有一个来自连接的大型笛卡尔积,并最终抛弃大部分行。 –

+0

明天我要回来工作时,我需要检查一下Ingres的版本。 –

+0

Ingres的版本是II 9.2.1/14210 –

回答

0

,和max( b.acction_time),你应该使用下面的脚本:

SELECT max(a.acction_time) as BIG, max(b.acction_time) as SMALL,DATEDIFF(s, max(a.acction_time), max(b.acction_time)) as DIFF 
FROM table1 as a, table1 as b 
WHERE a.id_num = '1' AND a.action_id = 'end_time' AND b.id_num = '1' AND b.action_id = 'start_time' 

如果你不记得DATEDIFF()函数,我会解释给你。

P.S:你的table1中的主键在哪里?

+0

OP的表似乎是某种历史/日志表,通常没有每行唯一键 - 通常是原始表唯一键和更新的组合时间戳将是唯一的(即使不受限制)。不幸的是,OP所使用的db似乎没有'DATEDIFF'函数,尽管它看起来是OP所尝试的基本形式是有效的。 –

+0

是的,虽然我上面提供的表格是简化版本,但没有主键,只有复合键。 Clockwork-Muse是正确的,它是一个日志表。 –

+0

我猜表中有一个由'id_num'和'version'属性组成的复合主键。 – DejanLekic

1

我会为此使用子选择。尝试: -

select a.action_time as max_end_time, b.action_time as max_start_time, 
a.action_time - b.action_time as diff 
from table a, table b 

where a.action_time = (select max(action_time) 
from table where action_id = 'end_time') 

and b.action_time = (select max(action_time) 
from table where action_id = 'start_time) 
0

这里是我的尝试:

SELECT start.action_time, end.action_time, 
    interval('seconds', end.action_time - start.action_time) as diff_secs 
FROM 
(
SELECT action_time 
FROM table a 
INNER JOIN 
( SELECT max(id_num) as max_id_num, max(version) as max_version FROM table 
) b on (id_num = max_id_num and version = max_version) 
WHERE a.action_id = 'start_time' 
) start 
CROSS JOIN 
(
SELECT action_time 
FROM table a 
INNER JOIN 
( SELECT max(id_num) as max_id_num, max(version) as max_version FROM table 
) b on (id_num = max_id_num and version = max_version) 
WHERE a.action_id = 'end_time' 
) end 

使用您的数据得到以下的输出:

+----------------------+----------------------+-----------+ 
|  action_time  |  action_time  | diff_secs | 
+----------------------+----------------------+-----------+ 
| 27-May-2014 10:10:57 | 27-May-2014 10:10:11 |  -46 | 
+----------------------+----------------------+-----------+ 

仅供参考,这里是我用来创建脚本,填充测试表

CREATE TABLE table 
(
id_num integer, 
version integer, 
action_id char(10), 
action_time timestamp 
) 

INSERT INTO table VALUES (1,2,'start_time', '2014-05-26 14:58:14'); 
INSERT INTO table VALUES (1,2,'end_time', '2014-05-26 14:58:16'); 
INSERT INTO table VALUES (1,4,'start_time', '2014-05-27 10:10:57'); 
INSERT INTO table VALUES (1,4,'end_time', '2014-05-27 10:10:11'); 
相关问题