将日期聚类为句点

时间:2012-02-06 09:55:55

标签: sql algorithm date cluster-analysis date-range

问题
我有一个密钥列表和每个密钥的另一个日期列表。基本上是日期键的多重映射(在Java中,Multimap<Key, Date>)。我使用这些键和日期来查询这样的表:

select * from Table where key = :key and date = :date

在生成Σ(|Date(Key)|)查询时,这是非常糟糕的性能。为了改善这一点,我可以看一下以下形式查询句点:

select * from Table where key in (:keys) and date >= :startDate and date <= :endDate

因此只需要一个查询,但仍然存在性能问题,因为这些日期可能会因非常大的周期(年)而不同。例如,在一个基本情况下,有两个密钥,第一个分配日期为“2010-01-01”,第二个日期为“2012-01-01”。在这种情况下,此查询将返回该时间段之间的所有值,即使我只需要两个记录。

解决方法
理想情况下,我想生成最佳查询数,其中最优查询是查询数量和返回数据量的函数。我想尽可能少的查询,但以这种方式返回最少量的不必要的数据。换句话说,简单的适应度函数可以是w|Queries| x |Data|,其中w是一定的权重。

鉴于此,前面的示例将导致两个查询,而如果日期靠近在一起,则它只是一个查询。

选项
这似乎是一个聚类问题,但我对聚类知之甚少,因此我不确定从哪里开始。我想我可能不得不将Multimap分解为(Key, Date)形式的个体,并从那里寻找一种识别簇本身数量的算法。

是否存在任何非常适合我的问题的聚类算法或方法,或者是否可能存在除群集之外的解决方案?

1 个答案:

答案 0 :(得分:0)

尝试使用IN

select * from Table where key = :key and date IN (date1, date2, date3, etc.)

有了它,您可以一次选择所需的日期。