【发布时间】:2014-01-15 00:07:52
【问题描述】:
我正在尝试查看是否可以有效地选择给定日期所属的时期。
假设我有一张桌子
id<long>|period_start<date>|period_end<date>|period_number<int>
假设我希望每个 id 都有“2013-11-20”所属的时期。
即天真
select id, period_number
from period_table
where '2013-11-20' >= period_start and '2013-11-20' < period_end
但是,如果我的日期超出任何 period_end 或任何 period_start 之前,它将找不到此 ID。在这些情况下,我想要最小值(如果在第一个 period_start 之前)或最大值(如果在最后一个 period_end 之后)。
如果这可以有效地完成,有什么想法吗?我显然可以进行多个查询(即,如上选择进入表,然后进行另一个查询以找出最小和最大周期)。
例如
+--+------------+----------+-------------+
|id|period_start|period_end|period_number|
+--+------------+----------+-------------+
|1 |2011-01-01 |2011-12-31|1 |
|1 |2012-01-01 |2012-12-31|2 |
|1 |2013-01-01 |2013-12-31|3 |
+--+------------+----------+-------------+
如果我想要 2012-05-03 属于哪个时期,我的幼稚 sql 可以工作并返回时期 #2(1|2 作为行,id,period_number)。但是,如果我想要什么时期 2014-01-14(或 2010-01-14)它不能把它放在桌子外面。
因此,由于“2014-01-14”> 2013-12-31,如果我选择 2010-01-14,我希望它返回行“1|3”,我希望它返回 1| 1,如 2010-01-14
关键是我们有一个索引表,可以跟踪不同类型的时期以及它们对许多不同事物的相对价值(想想季度、半年、年),而且它们都不符合正常年份。有时我们想说我们想要相对于日期 Y 的周期 X(某个整数)。如果我们可以将 Y 放在表中并计算出 Y 的 period_number,我们可以轻松地进行数学计算以找出添加/减去的内容价值。如果 Y 在表格的边界之外,我们将 Y 分别定义为表格的最大值/最小值。
【问题讨论】:
-
您能否发布一些示例数据和预期结果?您还使用什么 RDBMS(SQL 风格)?
-
添加了一个小例子。
-
请根据您的样本数据发布期望的结果。
2010-01-14和2014-01-14的输出究竟应该是什么? -
我认为你应该描述你试图解决的整体问题。你到底想做什么?您的查询不适用于 2014 年,因为该记录不存在。如果你插入它,问题就结束了。
-
我脑子里一直在想的事情是在数据摄取时处理这个问题,并包含一个从 mindate->first record date 和 last record date->maxdate 开始的虚假记录。那么问题是,如何使其与实时更新保持同步并确保其准确。