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_Client
和 domain_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
我正在尝试编写一个 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_Client
和 domain_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