返回表格加入后按日期排序的前N行

时间:2016-10-21 20:41:49

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

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

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。我现在尝试了一些东西,主要是试图在ON条件下使用ORDER BY updateDt取得TOP 2。然后我尝试用表替换V_Queue_History并执行相同操作,但是没有用。我只是尝试使用where条件,我检查是否

QueueB.cnlyMemberId为IN(从QueueB WHERE条件中选择TOP 2 cnlylMemberID);

但仍然没有。系统会告诉我它不知道QueueB是什么,因此它们都不会在WHERE语句中运行。我会更具体,但我刚刚使Access崩溃,我的思绪开始变得朦胧,这可能是多么令人沮丧。我根本没有很多使用Access / SQL的经验,而且我正在学习它,就像我去的那样。

所以回顾一下,第一个查询运行正常但我只需要在初始305之后返回状态更新的行。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果没有示例输出,我不确定你想要什么,也许这样的东西会有所帮助:

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)