我将数据写入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
,但我坚持如何进一步推进并减去'期间开始'数据,所以我的问题是 - 我怎样才能达到我需要的结果?
答案 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查询为您提供当前期间之前的原因 - 无论它们是否处于开始期间。