我正在开展一个项目,我的客户将文档(合同)发送给客户。这些文件经过几轮“事件”,因为它们来回发送(例如准备,发送给客户,收到客户修改,客户签名等)。对于特定公司(companyID 123456),我试图为每个文档提取最新事件。因此下面的示例查询可能会返回5个不同的文档,每个文档可能会有4个不同的事件。在示例结果中,我将其简化为单个文档(documentId 6789)。
鉴于下面的示例结果,我希望得到第三行。所有行都用于单个文档,并且该文档具有最新日期。但是,如下所示,我得到了四个。
如果我按文件ID分组,那么我得到正确的日期,但我的事件和事件ID值不正确(转置)。我唯一的成功是将每个值包装在Max()函数的Select语句中。当我这样做时,我得到了我想要的一行与正确的事件。但是,像文档ID这样的东西是错误的,因为它当然会返回最大ID,而不是匹配的那个。
有人可以帮我调整这个查询,以便得到我需要的结果吗?提前谢谢!
注意:我在这里找到了这个“解决方案”,但我不认为它直接适用于我正在做的事情: Fetch the row which has the Max value for a column
SELECT e.eventID, e.event, de.documentEventID, de.documentID, Max(de.eventDate) AS eventDate, sd.companyID, FROM siteDocuments sd LEFT JOIN documents d ON d.documentID = sd.documentID LEFT JOIN documentTypes dt ON dt.documentTypeID = d.documentTypeID LEFT JOIN documentEvents de ON de.documentID = sd.documentID LEFT JOIN events e ON e.eventID = de.eventID WHERE sd.companyID = 123456 GROUP BY 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
(我将破折号加入以强制格式化)
答案 0 :(得分:0)
您确定关联问题(特别是this answer)上的答案没有完全符合您的要求吗?
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而有所不同。)