我有一种情况,我已经用两种不同的方式解决了,但想知道人们对这些选项的看法,以及他们是否有其他选择......
系统正在处理数据的“间隔”。
- 所有数据都分配给一个“区间”
- 间隔由 Fact 表中的“interval_start”DATETIME 表示
- 维度表保存“间隔”的持续时间(不同实体可能不同)
- 维度表中还有一个“模式”标志
SQL 查询中需要以下规则...
模式0
如果记录条目在事实表中,则可以对其进行处理。
(无限制。)
模式 1
只有在“interval_start”是过去的情况下,记录才对处理有效。(已经开始但不一定结束的时间间隔。)
模式2
只有整个“间隔”都在过去时,记录才对处理有效。(已完成的时间间隔。)
为此创建的第一个 WHERE 子句如下...
WHERE
getDate() >=
CASE [table].mode
WHEN 0 THEN 0
WHEN 1 THEN [log].interval_start
WHEN 2 THEN [log].interval_start + [table].interval_period
ELSE NULL
END
有人担心这会使索引无法优化子句。另一种方法是使用多个 AND/OR 条件。
WHERE
([table].mode = 0 AND getDate() >= 0)
OR ([table].mode = 1 AND getDate() >= [log].interval_start)
OR ([table].mode = 2 AND getDate() >= [log].interval_start + [table].interval_period)
显然,哪个表现最好将取决于数据和索引等。但是对于我目前描述为“条件条件”的内容,是否有人有任何选择或替代方案?:)
干杯,马特。