1

解释

我正在做一个项目,我的客户将文件(合同)发送给他们的客户。这些文档在来回发送时会经历几轮“事件”(例如准备、发送给客户、从客户那里收到修订、由客户签名等)。对于特定公司(companyID 123456),我正在尝试提取每个文档的最新事件。因此,下面的示例查询可能会返回 5 个不同的文档,每个文档可能有 4 个不同的事件经历。在示例结果中,我将其简化为单个文档(documentId 6789)。

鉴于下面的示例结果,我希望得到第三行。所有行都针对单个文档,并且该文档具有最近的日期。但是,如下所示,我得到了四个。

如果我按 documentID 分组,那么我得到正确的日期,但我的事件和事件 ID 值不正确(转置)。我唯一的成功是将 Select 语句中的每个值包装在 Max() 函数中。当我这样做时,我会通过正确的事件获得我想要的一行。但是,文档 ID 之类的东西是错误的,因为它当然会返回最大 ID,而不是匹配的 ID。

有人可以帮我调整这个查询,以便我得到我需要的结果吗?提前致谢!

注意:我在这里找到了这个“解决方案”,但我认为它并不直接适用于我正在做的事情: Fetch the row which has the Max value for a column

询问

    选择 e.eventID,
            e.事件,
            de.documentEventID,
            de.documentID,  
            Max(de.eventDate) 作为事件日期,
            sd.公司ID,
    FROM siteDocuments sd
        LEFT JOIN 文档 d ON d.documentID = sd.documentID
        左连接 documentTypes dt ON dt.documentTypeID = d.documentTypeID
        LEFT JOIN documentEvents de ON de.documentID = sd.documentID
        LEFT JOIN 事件 e ON e.eventID = de.eventID

    哪里 sd.companyID = 123456

    按 e.eventID 分组

EXAMPLE RESULTS
-----------------------
EventId --- Event Doc --- EventId --- documentId --- eventDate
16 -------- FakeEventA -- 135791 ------ 6789 ------- 2012-04-11 08:35:54
32 -------- FakeEventB -- 726351 ------ 6789 ------- 2012-04-11 08:56:02
24 -------- FakeEventC -- 987236 ------ 6789 ------- 2012-05-09 16:48:57 <======
81 -------- FakeEventD -- 982378 ------ 6789 ------- 2012-04-20 14:06:19

(我放入破折号以强制格式化)

4

1 回答 1

0

您确定链接问题的答案(特别是这个答案)没有完全符合您的要求吗?

SELECT sd.* 
FROM siteDocuments AS sd
  LEFT OUTER JOIN siteDocuments AS sd2
    ON (sd.documentId = sd2.documentId AND sd.eventDate < sd2.eventDate) 
WHERE 
    sd2.documentId IS NULL
    and sd.documentId = 6789;

我以前用过这个答案来实现你正在寻找的东西。(为了保持性能,您必须小心在大型数据集上正确设置索引,但是 - 根据您使用的 DBMS 有所不同)。

于 2012-09-19T20:10:03.343 回答