【发布时间】:2025-12-01 19:25:01
【问题描述】:
我有一个大的 oracle(Oracle 数据库 12c 企业版版本 12.1.0.2.0)表说 table_name 每 15 秒更新一次。 它有很多列,但我担心的是:
Name Null? Type
--------------- -------- ---------------------------------
ID_1 NOT NULL NUMBER(38)
UTC_TIMESTAMP NOT NULL TIMESTAMP(6) WITH TIME ZONE
ID_2 VARCHAR2(8)
SERVER_NAME VARCHAR2(256)
ID_3 NUMBER(38)
COUNT_1 NUMBER(38)
COUNT_2 NUMBER(38)
我想做的是:
1) 获取 UTC_TIMESTAMP current_date - 5 分钟的所有记录(大约有 125K-150K)
2) 此数据将具有重复的 ID_1。因此,我只想获取每个 ID_1 在其重复项中具有 max(UTC_TIMESTAMP) 的那些记录。所以现在我们将拥有不同的 ID_1。
我尝试过的:使用以下 SQL
with temp_1 as (
select m.ID_2, m.ID_1, max(utc_timestamp) max_utc_timestamp
from commsdesk.table_name m
where m.ID_2 = 'TWC'
group by m.ID_2, m.ID_1)
select f.utc_timestamp
from commsdesk.table_name f
join temp_1 t
on t.max_utc_timestamp = f.utc_timestamp
and t.ID_2 = f.ID_2
and t.ID_1 = f.ID_1;
问题:我只能得到 ID_2、ID_1 和 UTC_TIMESTAMP,但我也想要所有其他列。 可以用 SQL 完成吗?
在 5 分钟的窗口中大约有 2200 条不同的 ID_1 和大约 125K-150K 记录。 因此,通过复制 excel 表中的 125K-150K 记录并过滤 2200 ID_1 中的每一个来找到每个 ID_1 的最大 UTC_TIMESTAMP 是不切实际的。 但如果有任何使用宏的快速方法,我也可以这样做。
样本虚拟数据:
ID_2 SERVER_NAME ID_3 ID_1 UTC_TIMESTAMP COUNT_1 COUNT_2
ABC PQRS.ABC.TPO 2 303 24-JUL-17 03.41.55.000000000 PM +00:00 4 0
ABC PQRS.ABC.TPO 2 1461 24-JUL-17 03.42.48.000000000 PM +00:00 1 7
ABC PQRS.ABC.TPO 2 1 24-JUL-17 03.41.36.000000000 PM +00:00 2 3
ABC PQRS.ABC.TPO 2 1461 24-JUL-17 03.41.16.000000000 PM +00:00 0 8
ABC PQRS.ABC.TPO 1 1 24-JUL-17 03.41.11.000000000 PM +00:00 5 0
ABC SRP.ROP.MTP 1 1 24-JUL-17 03.41.23.000000000 PM +00:00 0 0
ABC SRP.ROP.MTP 2 303 24-JUL-17 03.41.34.000000000 PM +00:00 0 0
ABC SRP.ROP.MTP 2 1461 24-JUL-17 03.41.31.000000000 PM +00:00 0 0
ABC SRP.ROP.MTP 4 303 24-JUL-17 03.41.26.000000000 PM +00:00 4 8
ABC SRP.ROP.MTP 2 303 24-JUL-17 03.41.20.000000000 PM +00:00 0 0
ABC SRP.ROP.MTP 1 1461 24-JUL-17 03.41.01.000000000 PM +00:00 3 8
ABC SRP.ROP.MTP 4 1 24-JUL-17 03.41.18.000000000 PM +00:00 9 1
预期输出:
ID_1 UTC_TIMESTAMP COUNT_1 COUNT_2
1 24-JUL-17 03.41.36.000000000 PM +00:00 2 3
303 24-JUL-17 03.41.55.000000000 PM +00:00 4 0
1461 24-JUL-17 03.42.48.000000000 PM +00:00 1 7
【问题讨论】:
-
根据您解释的规则,您的示例数据没有任何重复项。请展示一些具有代表性的样本数据和您对该数据的预期结果。
-
我已经更新了示例数据并添加了预期的输出。抱歉延迟回复,但我在周末无法访问数据。在获得预期输出后,我会将其用作子查询以从预期输出中获取 MAX(UTC_TIMESTAMP) 和 SUM(COUNT_1) AND SUM(COUNT_2)。
-
我第一次发布的查询得到了这个结果;我已经更新了我的答案以表明这一点。我不确定你对子查询的意思。您最终是在寻找
24-JUL-17 03.42.48, 7, 10` 的单一结果吗? -
是的,这正是我正在寻找的最终结果。我正在使用您的查询,并将在此处发布结果。再次感谢您。
-
更新后的解决方案完全符合我的要求,但是当我尝试通过手动计算来验证输出时,数字不同。在我的示例中,当手动验证给出“199 2679”时,SQL 给出了“51 2434”。但是我无法共享用于此用例的全部数据。它也可能是数据中的东西。所以我将您的回复标记为答案。