【问题标题】:Clustering dates into periods将日期聚类为期间
【发布时间】:2012-02-27 19:45:32
【问题描述】:

问题
我有一个键列表和每个键的另一个日期列表。基本上是日期键的多重映射(在 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) 形式的个体,然后从那里寻找一种算法来识别集群本身的数量。

是否有任何聚类算法或方法非常适合我的问题,或者是否有除聚类之外的解决方案?

【问题讨论】:

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


    【解决方案1】:

    尝试使用IN

    select * from Table where key = :key and date IN (date1, date2, date3, etc.)
    
    使用它,您可以立即选择所需的日期。

    【讨论】:

    • 我同意这对于大多数情况来说已经足够了,但是在某些情况下我必须解决某种形式的集群可能是有益的。例如,如果有10,000个键分布在10个日期。通过集群,系统将(希望)决定生成 10 个 SQL 查询,从而产生 10,000 条记录,而您的查询将返回 100,000 条记录(如果您将 key = :key 部分替换为 key in (:keys))。
    • 将您的信息添加到 #temp table 中,并在内部加入它和您的表格。
    猜你喜欢
    • 1970-01-01
    • 2020-04-16
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多