我试图通过:状态,产品,版本,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