Sybase SQL 报告脚本

Sybase SQL Script for a Report

我正在尝试编写一个 SQL 脚本,它将在一个脚本中提供以下信息: 节点,lastUpdatedTime,bytesWritten

我想从 domain_Client 中提取具有最新 lastUpdatedTime 的节点。

From "domain_Client" table:
Node        lastUpdatedTime
Server1     04042015
Server1     04082015
Server2     04072015
Server2     04062015

我在 domain_JobArchive 中找到了一个带有 bytesWritten 和 lastUpdatedTime 的不同 table(而不是只有 bytesWritten 的旧 domain_Jobs)。

From "domain_JobArchive" table:
bytesWritten    lastUpdatedTime
1000            04042015
2000            04082015
3000            04072015
4000            04062015

期望的结果:

Node        lastUpdatedTime     bytesWritten
Server1     04082015            2000
Server2     04072015            3000

到目前为止,我已经能够使用以下脚本查询节点和 lastUpdatedTime:

select
node, lastUpdatedTime
from domain_Client a
where lastUpdatedTime = (select max(lastUpdatedTime) from domain_Client b
where a.node = b.node

我一直纠结于如何在脚本中包含 bytesWritten。

我是 Sybase 的新手 SQL,如有任何帮助,我们将不胜感激。谢谢。

那么现在如何将 bytesWritten 合并到上面的现有脚本中?

在提出解决方案之前。我假设 domain_Client 中的每条记录在某些基础上在 domain_Jobs 中都有一个隐式记录:每次在 domain_Client 中插入一条记录时,都会在 domain_Jobs 中插入另一条记录,并且最后插入的记录出现在 select 结果的顶部,否则有解决方案。

我使用 Oracle 是因为 sqlfiddle 中没有 Sybase 数据库支持。 您可以将其用作灵感。请注意我没有优化查询,所以你需要做一些调整。

为了能够做你想做的事,你必须在 domain_Clientdomain_Jobs 中有一个连接列。因此,我们将向 tables 添加一个新列(也许您应该创建 tables 的副本并对其进行修改)。

Alter table domain_Client add join_col number;
Alter table domain_Jobs add join_col number;

之后创建两个序列:

Alter table domain_Client add join_col number;
Alter table domain_Jobs add join_col number;

像这样更新 table 上的 join_col

update  domain_Client set join_col = cli_seq.nextval; 
update  domain_Jobs set join_col = cli_jobs.nextval; 

现在我们可以在两者之间进行连接 table 并获得结果:

SELECT vb.node,
   va.maxupdatetime,
   vb.bytesWritten
FROM
( SELECT node,
         max(LASTUPDATEDTIME) maxupdatetime
 FROM domain_Client
  GROUP BY node) va
INNER JOIN
( SELECT node,
   lastUpdatedTime,
   bytesWritten
 FROM domain_Client a
 INNER JOIN domain_JobArchive b ON a.LASTUPDATEDTIME = b.LASTUPDATEDTIME) vb      ON va.node = vb.node
 AND va.maxupdatetime = vb.lastUpdatedTime

这里是fiddle

的link