首页 > 解决方案 > 如何在空记录之间填充缺失的日期?

问题描述

我正在尝试在空记录之间填充日期,但没有成功。尝试做多项选择方法,尝试加入,但似乎我错过了重点。我想生成缺少日期的记录,以从这段代码生成图表。首先,我想“手动”填写日期,稍后我将重新组织此代码并将该方法交换为参数。

有人可以帮我解决这个问题吗?

SELECT
    LOG_LAST AS "data",
    SUM(run_cnt) AS "Number of runs"

FROM

dual l
LEFT OUTER JOIN "LOG_STAT" stat ON
stat."LOG_LAST" = l."CLASS"

WHERE

new_class = '$arg[klasa]'



--SELECT to_date(TRUNC (SYSDATE - ROWNUM), 'DD-MM-YYYY'),
--0
 --FROM dual CONNECT BY ROWNUM < 366

GROUP BY
    LOG_LAST
ORDER BY

LOG_LAST

//编辑:

LOG_LAST 只是一个带有日期的列(例如:25.04.2018 15:44:21),run_cnt 是一个只有一个简单数字的列,LOG_STAT 是一个包含 LOG_LAST 和 run_cnt 的表,new_class 是一个带有记录名称的列我想列出记录,即使它们不存在。例如:我有一个日期为 24-09-2018、23-09-2018、20-09-2018、18-09-2018 的记录,我想列出即使没有名称和 run_cnt 的记录,但要生成缺失某个时期的日期

标签: sqloracle

解决方案


你想要的或多或少是:

select d.day, sum(ls.run_cnt)
from all_dates d
left join log_stat ls on trunc(ls.log_last) = d.day
where ls.new_class = :klasa
group by d.day
order by d.day;

上述查询中的all_dates表应该包含所有以最小 klasa log_last 日期开始并以最大 klasa log_last 日期结束的日期。您可以通过递归查询获得这些日期。

with ls as
(
  select trunc(log_last) as day, sum(run_cnt) as total
  from log_stat
  where new_class = :klasa
  group by trunc(log_last)
)
, all_dates(day) as
(
  select min(day) from ls
  union all
  select day + 1 from all_dates where day < (select max(day) from ls)
)
select d.day, ls.total
from all_dates d
left join ls on ls.day = d.day
order by d.day;

推荐阅读