差距和孤岛 - 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的主要内容,如果未能解决你的问题,请参考以下文章