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
重新发布这个问题,因为我仍在努力寻找正确的解决方案。
我能够隔离 '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