我想在我的Access查询中编写一个表达式,以检查我们正在运行下周的项目是否在该日期之前的 4周中运行。我无法理解如何在同一查询中检查某些内容,然后使用该检查的返回值来检查更多内容。我尝试过的方法是编写另一个查询,该查询将使用第一个查询的结果(来自7/20/2015
的项目被隔离)来检查这些项目的日期,但是我遇到了问题因为然后我必须将该查询绑定到原始表,该表复制数据。
用伪代码编写,看起来有点像:
如果item
的{{1}}为job_date
,请在7/20/2015
之前检查该项目的所有实例,如果几周内没有实例7/20/2015
,7/13/2015
,7/6/2015
或6/29/2015
,然后返回6/22/2015
。
以更直观的方式撰写:
item
项目A不会被退回,因为我们一直在运行。项目B将返回,因为即使我们在item job_date
A 6/22/2015
A 6/29/2015
A 7/6/2015
A 7/13/2015
A 7/20/2015
item job_date
B 6/15/2015
B
B
B
B
B 7/20/2015
item job_date
C 6/22/2015
C
C
C 7/13/2015
C 7/13/2015
C 7/20/2015
item job_date
D
D
D
D
D
D
上运行它,也就是6/15/2015
之前超过4周。 7/20/2015
不会返回,因为它没有包含目标日期(Item D
)的行。
注意:
理想情况下,我会使用能够自动确定下周某日期的表达式,为了清晰起见,我只是在这里使用了硬日期。如果你想使用硬日期,请随意。
我们的星期几星期一开始。
一个项目可以在一周内多次运行。例如,7/20/2015
可以包含Item C
和7/13/2015
的2行。作业编号(未显示,但存在于同一个表中)是表中的唯一标识符。如果7/13/2015
要运行两次,则作业将为Item C
和H000001584-0030
。
答案 0 :(得分:2)
当我提供 7/20/2015 作为参数值时,下面的查询会从您的示例数据中返回此结果集:
item
----
B
该查询包含一个子查询,该子查询返回在目标日期之前的28天内具有 job_date 值的行的项目。请注意,子查询不会返回项,该项在该范围内没有 job_date 值 - 因此它只为您提供了具有 job_date的项目在那个范围内。因此,保持连接到子查询并仅询问“右侧”为空的行意味着我们从最终结果集中排除这些项。
PARAMETERS pTarget DateTime;
SELECT j.item
FROM
dbo_job AS j
LEFT JOIN
(
SELECT [item]
FROM dbo_job
WHERE job_date>=DateAdd('d', -28, [pTarget]) And job_date<[pTarget]
GROUP BY [item]
) AS sub
ON j.item = sub.item
WHERE j.job_date=[pTarget] AND sub.item Is Null
GROUP BY j.item;