需要帮助选择具有最大日期的行

时间:2012-09-19 19:56:58

标签: mysql sql database max

说明

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

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

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

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

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

QUERY


    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

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

1 个答案:

答案 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而有所不同。)

相关问题