差距和岛 - 微软访问



我试图通过:状态,产品,版本,LG_SG,区域和区域因素进行分组。然后,我想将最小开始日期和最大结束日期附加到记录。我有一个差距和岛屿问题。如果查看数据,则.8428以两个不按时间顺序排列的块显示。如何在访问中解决此问题?

这是我当前的数据。

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

谢谢大家的帮助。

此代码是start

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]));

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

我最初认为自动数字字段将有助于ID结束日期,但现在我不确定。此查询已经完成了我对自动编号字段的工作,我还没有看到如何获得结束日期。

更新:这不是优雅的,但是我可以通过几个步骤进行操作:将查询保存在上面,作为起点。然后使用此查询查找同一abore_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;

根据数据,您需要添加加入以将逻辑限制为匹配的状态或其他字段。

考虑使用自动数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 

最新更新