SQL - 从每日快照获取时间范围的数据

时间:2014-09-30 14:38:05

标签: sql oracle

我将数据写入i DB作为每日快照。表格是

DECISION_REFUSAL_REASON_STATS
    -REASON_STTS_ID (fk_reasons_stats_id)
    -PERIOD_ID (fk_period_id)
    -REFUSAL_REASON_CODE
    -REFUSAL_COUNT

REASONS_STATS
    -ID
    -REF_MANUFACTURER
    -REF_PRODUCT_CODE
    -REF_WARRANTY_CODE

PERIOD
    -ID
    -EXACT_DATE

期间表更复杂但是出于问题的目的应该足够了。就像现在一样,它只是一个日期(yyyy-mm-dd)与DECISION_REFUSAL_REASON_STATS中用作外键的id的关联。

此表(DECISION_REFUSAL_REASON_STATS)包含当前情况的每日快照,以这种方式构建,从PERIOD表中每天存储有关拒绝原因的统计信息。现在,在特定的一天,可能存在多个拒绝原因,并且仅存储已更新的那些原因。

即。

day 1 (as first day of the whole period)
-------
bad writing: 2 
incorrect receipt: 1 

day 2
-------
bad writing: 3 
to late: 1

day 3
-------
to late: 3 
incorrect receipt: 2 

=====================

我需要在第2天和第3天之间生成统计数据,因此预期结果为:

Result (day 3 - day 1 stats)
-------
to late: 3
incorrect receipt: 2 - 1 = 1
bad writing: 3 - 2 = 1

如您所见,这不仅仅是从第3天数据中减去第1天数据的问题。我需要在第3天说明那些遗漏的原因。

我设法获得了该期间最后一天的统计数据

SELECT
  RS.REF_WARRANTY_CODE
, DRRS_END.REFUSAL_REASON_CODE
, MAX(NVL(DRRS_END.REFUSAL_COUNT, 0))  
FROM
  DECISION_REFUSAL_REASON_STATS DRRS_END 
  JOIN REASON_STATS RS ON (DRRS_END.REASON_STTS_ID = RS.ID)
  LEFT JOIN PERIOD P_END ON (DRRS_END.PERIOD_ID = P_END.ID)
WHERE 
  P_END.EXACT_DATE <= TO_DATE('2013-12-31', 'YYYY-MM-DD')
GROUP BY 
  CS.REF_GUARANTEES_CODE
, CRRS_END.REFUSAL_REASON_CODE
ORDER BY
  CS.REF_GUARANTEES_CODE

,但我坚持如何进一步推进并减去'期间开始'数据,所以我的问题是 - 我怎样才能达到我需要的结果?

1 个答案:

答案 0 :(得分:0)

我没有看到你减去&#34;迟到&#34;正如你所做的其他原因,但我认为这是疏忽,你确实想要这样做。正如我所理解的那样,你真正想要的是:&#34;截至今天,原因的最后一次改变是什么?&#34; (我可以通过说,&#34;今天保持,以及今天和开始日之间的任何变化,以及前一天和开始日之间的任何变化来修改它以符合您的结果。&#34;)我认为您需要得到这个的复合查询,例如:(并且你不提及版本,所以我用10g)(列名缩写):

SELECT y.refusal_code, y.refusal_count - nvl(x.refusal_count,0)change_from_today, z.refusal_code,z.refusal_count - nvl(x.refusal_count,0)change_from_prev_day_not_today 从 (从stats中选择*,其中period_id =(从期间表中选择当前期间)y 左外连接 (从stats中选择*,其中period_id =(从期间表中选择开始期间)x 左外连接 (从不存在的统计数据中选择*(从统计数据中选择1,其中句点=当前) 和period_id =(从stats中选择max(period),其中period&lt; current period)z

注意:y查询为您提供当前期间比较的原因 x查询为您提供从开始时段到比较的原因 z查询为您提供当前期间之前的原因 - 无论它们是否处于开始期间。