MySQL 正确分桶的案例陈述

MySQL Case Statement for proper bucketing

重新发布这个问题,因为我仍在努力寻找正确的解决方案。

我能够隔离 'OA' 唯一的场景并将它们适当地标记为 NA。然而,我在隔离 'I' 唯一事件以及正确老化同时具有 I 和 OA 事件的 EquipID 时遇到了问题。

这是我现在用于老化的逻辑,它非常适合 'I' 事件,但正确隔离 'I' 和 'OA' EquipID,然后得到差异这两个日期之间的时间让我望而却步。

datediff(curdate(),concat(left(eventDateTime,4),'-',mid(eventDateTime,5,2),'-',mid(eventDateTime,7,2))) as age_in_depot

我尝试按 EquipID 分组,但当然这只给我一个 eventDateTime 结果,而且它始终是第一个结果,在 'I' 和 'OA' 的情况下,它只是 'I' eventDateTime.

我也有逻辑来识别 'I' 和 'OA' 事件,但这只有在我打算将 EquipmentID 分组到一行时才能正常工作,如上所述,删除第二个正确老化这些 EquipID 需要 eventDateTime 条目。

GROUP_CONCAT( DISTINCT StatusCD) as StatusCD

非常感谢任何帮助或见解。一旦我标记了这个 'I' 唯一的事件并老化,我终于可以完成我正在为我们的团队构建的这个仪表板。

提前致谢。

J

旋转 table,这样您就可以将同一 EquipID 的开始日期和结束日期放入不同的列中。然后您可以减去它们,并为缺失的日期应用适当的默认值。

SELECT EquipID, InDate, OutDate, StatusCD_N,
    CASE WHEN InDate AND OutDate THEN DATEDIFF(OutDate, InDate)
         WHEN InDate THEN DATEDIFF(CURDATE(), InDate)
         ELSE 'N/A' -- only OutDate
    END AS AgeInDepot
FROM (
    SELECT EquipID, GROUP_CONCAT(StatusCD) AS StatsuCD_N,
        MAX(IF(StatusCD = 'I', DATE(STR_TO_DATE(eventDateTime, '%Y%m%d%H%i')), NULL) AS InDate,
        MAX(IF(StatusCD = 'OA', DATE(STR_TO_DATE(eventDateTime, '%Y%m%d%H%i')), NULL) AS OutDate
    FROM yourTable
    GROUP BY EquipID
) AS x