差距和孤岛 - Microsoft Access

Posted

技术标签:

【中文标题】差距和孤岛 - Microsoft Access【英文标题】:Gaps and Island - Microsoft Access 【发布时间】:2017-12-06 14:17:55 【问题描述】:

我正在尝试按以下方式对我的数据进行分组:州、产品、版本、LG_SG、面积和面积因子。然后,我想将最短开始日期和最长结束日期附加到记录中。我有一个差距和岛屿问题。如果您查看数据,.8428 显示在两个不按时间顺序排列的块中。如何在 Access 中解决此问题?

这是我目前的数据。

state   start_date  end_date    product edition lg_sg   area    area_factor
IL  10/1/2010   11/1/2010   PPO 6   SG  1   0.86
IL  11/1/2010   12/1/2010   PPO 6   SG  1   0.86
IL  12/1/2010   1/1/2011    PPO 6   SG  1   0.86
IL  1/1/2011    2/1/2011    PPO 6   SG  1   0.8428
IL  2/1/2011    3/1/2011    PPO 6   SG  1   0.8428
IL  3/1/2011    4/1/2011    PPO 6   SG  1   0.8428
IL  4/1/2011    5/1/2011    PPO 6   SG  1   0.8428
IL  5/1/2011    6/1/2011    PPO 6   SG  1   0.8428
IL  6/1/2011    7/1/2011    PPO 6   SG  1   0.8428
IL  7/1/2011    8/1/2011    PPO 6   SG  1   0.8428
IL  8/1/2011    9/1/2011    PPO 6   SG  1   0.8428
IL  9/1/2011    10/1/2011   PPO 6   SG  1   0.8428
IL  10/1/2011   11/1/2011   PPO 6   SG  1   0.825944
IL  11/1/2011   12/1/2011   PPO 6   SG  1   0.825944
IL  12/1/2011   1/1/2012    PPO 6   SG  1   0.825944
IL  1/1/2012    2/1/2012    PPO 6   SG  1   0.8428
IL  2/1/2012    3/1/2012    PPO 6   SG  1   0.8428
IL  3/1/2012    4/1/2012    PPO 6   SG  1   0.8428
IL  4/1/2012    5/1/2012    PPO 6   SG  1   0.8428

我希望它看起来像这样。

state   start_date  end_date    product edition lg_sg   area    area_factor
IL  10/1/2010   1/1/2011    PPO 6   SG  1   0.86
IL  1/1/2011    10/1/2011   PPO 6   SG  1   0.8428
IL  10/1/2011   1/1/2012    PPO 6   SG  1   0.825944
IL  1/1/2012    5/1/2012    PPO 6   SG  1   0.8428

感谢大家的帮助。

【问题讨论】:

添加您的查询:Group By Year(start_date), area_factor. 这是否适用于所有场景?我有一张大桌子,这只是说明我想法的一小部分。如果它们恰好落在不同的年份,添加“Year(start_date)”不会起作用吗? @古斯塔夫 一种方法是编写一个 vb 脚本来汇总数据 - 这是一个选项吗?如果您可以在文件中放置一个自动编号 ID 字段以方便将数据与先前记录匹配,则第二种方法可能会起作用 - 这是一种选择吗? @DonGeorge 我可以写一个 vb 脚本。我知道该怎么做,但希望通过查询来解决这个问题。我确实在整个表上有一个索引,并且记录是唯一的,所以我可能会添加一个自动编号 ID。如果我走这条路,你能详细说明我会做什么吗? 不知道。我们只有您的样本数据。 【参考方案1】:

这段代码是一个开始

SELECT data.state, data.start_date, data.product, data.edition, data.lg_sg, data.area, data.area_factor, data_1.area_factor AS previous
FROM data LEFT JOIN data AS data_1 ON data.start_date = data_1.end_date
WHERE (((data_1.area_factor) Is Null Or (data_1.area_factor)<>[data].[area_factor]));

它为您提供每个范围的开始日期,但不提供结束日期。如果您将其用作搜索特定日期的参考,这可能就足够了 - 您可以搜索小于或等于您的搜索日期的最后一条记录,而无需结束日期。

我最初认为自动编号字段可以帮助确定结束日期,但现在我不确定。这个查询已经完成了我使用自动编号字段完成的工作,但我还不太清楚如何获取结束日期。

更新:这并不优雅,但我可以通过几个步骤完成: 将上面的查询另存为 StartDates。然后使用此查询查找相同 area_factors 的下一个开始日期:

SELECT StartDates.state, StartDates.start_date, StartDates.product, StartDates.edition, StartDates.lg_sg, StartDates.area, StartDates.area_factor, (select min(start_date) from StartDates T where T.area_factor=StartDates.area_factor and T.start_date>StartDates.start_date) AS [Next]
FROM StartDates
ORDER BY StartDates.start_date;

将此保存为 NextDates,然后使用此最终查询获得答案:

SELECT NextDates.state, NextDates.start_date, Max(data.end_date) AS end_date, NextDates.product, NextDates.edition, NextDates.lg_sg, NextDates.area, NextDates.area_factor
    FROM NextDates INNER JOIN data ON NextDates.area_factor = data.area_factor
    WHERE (((data.start_date)<[next])) OR (((NextDates.Next) Is Null))
    GROUP BY NextDates.state, NextDates.start_date, NextDates.product, NextDates.edition, NextDates.lg_sg, NextDates.area, NextDates.area_factor;

根据数据,您需要添加连接以将逻辑限制为匹配状态、产品或其他字段。

【讨论】:

结束日期并不重要。结束日期总是正好在开始日期后一个月。我有一个单独的查询,使用此逻辑添加结束日期。使用您刚刚提供的查询后,我可以调整该字段。 好的,很好 - 但您预期输出的结束日期不是开始日期 + 1 个月。不过,很高兴这个起点有所帮助。 在运行您的查询之前,我先发制人地留下了我的评论。我意识到在我运行它并注意到同样的问题之后。 @MBrady - 只是好奇,这对你有用还是还有问题?【参考方案2】:

考虑使用自动编号 id 字段(假设存在)创建一个不同的组,grp,然后在外部查询中聚合:

SELECT r.state, Min(r.start_date) as min_start_date, Max(r.end_date) as 
       max_end_date, r.product, r.edition, r.lg_sg, Max(r.area) as max_area, 
       r.area_factor
FROM
  (SELECT *,
            (SELECT max(id) FROM GapsIslandsTable sub 
             WHERE sub.area_factor = g.area_factor 
               AND Year(sub.start_date) = Year(g.start_date)) as grp
   FROM GapsIslandsTable g) r

GROUP BY r.state, r.product, r.edition, r.lg_sg, r.area_factor, r.grp

-- state    min_start_date  max_end_date    product edition lg_sg   max_area   area_factor
-- IL            10/1/2011      1/1/2012        PPO       6    SG          1      0.825944 
-- IL             1/1/2011     10/1/2011        PPO       6    SG          1        0.8428 
-- IL             1/1/2012      5/1/2012        PPO       6    SG          1        0.8428 
-- IL            10/1/2010      1/1/2011        PPO       6    SG          1          0.86 

【讨论】:

以上是关于差距和孤岛 - Microsoft Access的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:寻找就业差距——孤岛和差距问题

令人费解的差距和孤岛 ORACLE SQL

差距和孤岛问题是不是有正式定义?如果是这样,这个问题是不是满足它?

SQL Server - 计算会话数 - 差距和孤岛

具有开始和结束日期的差距和孤岛(有效期)

使用差距和孤岛知识找到最长时间不改变就业(SQL)