我有一个表,其中有以下字段:
start | end | field A | field B | field C | id
我想摆脱最后的领域。
在我的应用程序中,用户提供了一个单独的日期,我找到了日期介于开始和结束之间的条目的数据。我想这样做,所以我只需要找到在开始日期之后和下一个开始日期之前的条目。
如何组合SQL查询??
现在是:
Select * from table where $date between start and end
我想我必须在
您可以使用:
Select *
from table
where $date >= start
order by start
limit 1;
编辑:
如果您想要结束日期之后的第一条记录,那么您可以执行类似的操作,只需在end
而不是start
:上进行比较
Select *
from table
where $date > end
order by start
limit 1;
事实上,在这种情况下,您希望保留开始和结束日期。即使它是多余的信息。
在数据仓库中,我们拥有维度缓慢变化的实体。它们是通过链接开始和结束日期构建的——就像您的示例中一样。保持这种特定的冗余比用每个查询搜索下一个条目要高效得多。这是可能的,但这意味着要运行子查询或对表的一部分进行排序。
专业分析数据库是如何处理这一问题的?
IBM和Teradata有一个叫做temporal的特性。它包含一种数据类型(PERIOD),该数据类型包含开始日期和结束日期以及处理重叠等的附加功能。
一句话:保持冗余,享受简短的回答时间。