Return table 加入后按日期排序的前 N ​​行

Return top N rows ordered by date after table join

我几周前发布了一个问题,现在我已经过去了,发现了新的需求和新的问题。我正在使用 access 2010,不确定是什么版本的数据库;y access g运行t 要使用的工具(例如,没有对象)。我有一个有效的查询,它看起来像这样。此查询的目标是使用一行作为基线,并按时间顺序查找其后的所有相关行。据我所知,这可能是一个非常粗略的解决方案。

SELECT QueueA.cnlyMemberId, QueueA.updateUser AS 305UpdateUser, QueueA.updateDt AS 305UpdateDt, QueueB.statusCd
FROM (SELECT cnlyMemberID, updateUser, updateDt 
      FROM V_Queue_History
      WHERE statusCd = "305" AND
            V_Queue_History.updateDt Between [Enter Start Date:] And [Enter End Date: (must be at least one day apart)]
     ) AS QueueA INNER JOIN
     V_Queue_History AS QueueB
     ON (QueueA.cnlyMemberID = QueueB.cnlyMemberID AND
         QueueA.updateDt < QueueB.updateDt
        )

现在我要做的是按时间顺序查找前305个statusCd和下一个statusCd,而不是后面的每一个statusCd。我现在已经尝试了一些事情,主要是尝试在 ORDER BY updateDt 处于 ON 状态时获得 TOP 2。然后我尝试用 table 替换 V_Queue_History 并做同样的事情,但没有用。我只是尝试使用 where 条件来检查

QueueB.cnlyMemberId IN (SELECT TOP 2 cnlylMemberID FROM QueueB WHERE 条件);

但还是一无所获。系统会告诉我它不知道 QueueB 是什么了,所以它的 none 会在 WHERE 语句中 运行。我会更具体地说明,但我刚刚让 Access 崩溃,我的头脑开始变得模糊,因为这是多么令人沮丧。我对 Access/SQL 一点经验都没有,我几乎是边学边学。

所以回顾一下,第一个查询 运行 没问题,但我需要 return 仅在初始 305 之后首先更新状态的行。

谢谢!

如果没有样本输出,我不确定你想要什么,也许这样的事情会有所帮助:

SELECT QueueA.cnlyMemberId, QueueA.updateUser AS 305UpdateUser, QueueA.updateDt AS 305UpdateDt, QueueB.statusCd
FROM (SELECT cnlyMemberID, updateUser, updateDt 
      FROM V_Queue_History
      WHERE statusCd = "305" AND
            V_Queue_History.updateDt Between [Enter Start Date:] And [Enter End Date: (must be at least one day apart)]
     ) AS QueueA INNER JOIN
     V_Queue_History AS QueueB
     ON QueueA.cnlyMemberID = QueueB.cnlyMemberID
WHERE (QueueB.updateDt = 
   (SELECT Min(updateDt) FROM V_Queue_History V2
    WHERE V2.cnlyMemberID = QueueA.cnlyMemberID 
    AND V2.updateDt > QueueA.updateDt))

这假设在 305 之后总是有一个状态代码,并且没有两条记录具有相同的更新日期。

如果您需要获取 305 之后的前 N ​​个状态码,那么您可以将 WHERE 子句更改为如下,虽然我不知道性能是否适合您的情况:

WHERE QueueB.updateDt IN 
   (SELECT TOP 5 updateDt FROM V_Queue_History V2
    WHERE V2.cnlyMemberID = QueueA.cnlyMemberID 
    AND V2.updateDt > QueueA.updateDt
    ORDER BY V2.updateDt)