访问查询:获得扭曲的日期差异

时间:2016-08-19 16:35:36

标签: sql ms-access ms-access-2010

我会尽力解释这一点,所以如果我的解释有点尴尬,我会事先道歉。如果我某处有雾,请告诉我有什么可以帮到你。

我有一张充满电路和日期的桌子。每个电路在约36个月或48个月的时间周期内进行修整。我有一个专栏给我这个信息。每次完成电路的微调周期时,我都有一条记录。我试图将已知的电路中断列表与带有中断数据的表格链接到带有电路修整历史记录的表格。扭曲如下:

我只想回收超过其修剪周期6个月的电路。因此,我需要记录一个电路的所有记录,查看每个单独的记录,找到相对于当前正在检查的记录的最新记录(我将需要每个记录检查的每个记录),计算两个月内的两个记录之间的差异,然后只返回给定馈线的任意两个条目之间超过6个月差异的记录。

以下是数据示例:

+----+--------+----------+-------+
| ID | feeder | comp     | cycle |
| 1  | 123456 | 1/1/2001 | 36    |
| 2  | 123456 | 1/1/2004 | 36    |
| 3  | 123456 | 7/1/2007 | 36    |
| 4  | 123456 | 3/1/2011 | 36    |
| 5  | 123456 | 1/1/2014 | 36    |
+----+--------+----------+-------+

以下是我想要的结果集示例(请注意:循环可能因电路而异,因此循环列中的值需要在计算中以确定我是否超过了在装饰之间循环6个月):

+----+--------+----------+-------+
| ID | feeder | comp     | cycle |
| 3  | 123456 | 7/1/2007 | 36    |
| 4  | 123456 | 3/1/2011 | 36    |
+----+--------+----------+-------+

这是我开始的查询,但我在确定如何正确进行日期计算方面做得很失败:

SELECT temp_feederList.Feeder, Temp_outagesInfo.causeType, Temp_outagesInfo.StormNameThunder, Temp_outagesInfo.deviceGroup, Temp_outagesInfo.beginTime, tbl_Trim_History.COMP, tbl_Trim_History.CYCLE

FROM (temp_feederList 

LEFT JOIN Temp_outagesInfo ON temp_feederList.Feeder = Temp_outagesInfo.Feeder) 

LEFT JOIN tbl_Trim_History ON Temp_outagesInfo.Feeder = tbl_Trim_History.CIRCUIT_ID;

我真的无法弄清楚我需要从哪里开始获取最新的条目并进行数学比较。我之前从未被要求做过这种复杂的SQL,所以我要感谢你们所有人的耐心以及你们愿意放贷的任何帮助。

2 个答案:

答案 0 :(得分:2)

我正在做一些假设,但这会使用子查询为您提供进纸列表中的行,其中上一个完成日期大于周期所指示的月份数:

SELECT tbl_Trim_History.ID, tbl_Trim_History.feeder,
   tbl_Trim_History.comp, tbl_Trim_History.cycle
FROM tbl_Trim_History
WHERE tbl_Trim_History.comp>
   (SELECT Max(DateAdd("m", tbl_Trim_History.cycle, comp)) 
    FROM tbl_Trim_History T2 
    WHERE T2.feeder = tbl_Trim_History.feeder AND 
      T2.comp < tbl_Trim_History.comp)

如果您需要检查超过36个月,可以在DateAdd函数计算的月份中添加任意值。

此外,我不知道周期的值是否指定了从前一周期的月数或月份到下一周期的月数。如果是后者,我会将DateAdd函数中的tbl_Trim_History.cycle改为循环。

答案 1 :(得分:1)

SELECT tbl_trim_history.ID, tbl_trim_history.Feeder,
  tbl_trim_history.Comp, tbl_trim_history.Cycle, 
  (select max(comp) from tbl_trim_history T 
   where T.feeder=tbl_trim_history.feeder and
      t.comp<tbl_trim_history.comp) AS PriorComp, 
  IIf(DateDiff("m",[priorcomp],[comp])>36,"x") AS [Select]
FROM tbl_trim_history;

此查询识别(最后一列中的X)来自tbl_trim_history的超过周期时间的记录 - 但正如评论中所述,我不完全确定这是否是您需要的,或者如何合并其他2个表。一旦你看到它在做什么,你可以修改它只保留你需要的记录。