尝试使用子查询执行 MAX 时出现 Teradata 错误 3504

Teradata error 3504 when trying to execute MAX with Subquery

很确定它一定与 MAX 有关,但不确定如何解决这个问题.... SELECT失败。 3504:(-3504)选定的非聚合值必须是关联组的一部分。 任何 Feedback/Advice/Assistance 表示赞赏。 尝试收集大型设备子集 (30k+) 的各种维护计划工作的最后完成日期。我很难找到合适的问题来自行搜索。

SELECT 
MRC,
EQUIPMENT,
DESCRIPTION,
CLASSCODE,
CRITICALITY,
STATUS,
PM,
PMDESCRIPTION,
NEXTDUE,
PMTYPE,
ASSIGNEDBY,
ASSIGNEDTO,
FREQUENCY,
UOM,
WOEQUIP,
WORKORDER,
WORKORDERPM,
CHECKS,
MAX(LastCompleted) AS CDATE,
WOSTATUS
FROM
(SELECT
SE.EquipmentSurfaceAssetBK AS "MRC",
SE.EquipmentCodeBK AS "EQUIPMENT",
SE.EquipmentDescription AS "DESCRIPTION",
SE.EquipmentClassBK AS "CLASSCODE",
SE.EquipmentCriticality AS "CRITICALITY",
SE.EquipmentCostCode AS "COSTCODE",
SE.EquipmentStatus AS "STATUS",
PE.EqPMCodeBK AS "PM",
PM.PMDescription AS "PMDESCRIPTION",
PE.EqPMDueDate AS "NEXTDUE",
PE.EqPMType AS "PMTYPE",
PE.EqPMDeactivatedDate AS "DDATE",
PE.EqPMAssignedBy AS "ASSIGNEDBY",
PE.EqPMAssignedToResourceBK AS "ASSIGNEDTO",
PE.EqPMFrequency AS "FREQUENCY",
PE.EqPMFrequencyUOM AS "UOM",
WO.WorkOrderEquipmentcodeBK AS "WOEQUIP",
WO.WorkOrderCodeBK AS "WORKORDER",
WO.WorkOrderPMCodeBK AS "WORKORDERPM",
CASE
    WHEN WO.WorkOrderPMCodeBK = PE.EqPMCodeBK THEN 'YES' ELSE 'NO'
END AS "CHECKS",
WO.WorkOrderStatus AS "WOSTATUS",
WO.WorkOrderCompletedDate AS "LastCompleted"
FROM IDW_PL_SURFACE.DIMSurfaceEquipment SE 
JOIN IDW_PL_SURFACE.DIMEquipmentPM PE ON SE.EquipmentCodeBK = PE.EqPMEquipmentCodeBK
JOIN IDW_PL_SURFACE.DIMSurfacePM PM ON PE.EqPMCodeBK = PM.PMCodeBK
JOIN IDW_PL_SURFACE.DIMWorkOrder WO ON SE.EquipmentCodeBK = WO.WorkOrderEquipmentcodeBK) AS ST
WHERE 
1=1
AND
STATUS IN ( 'I', 'IDLE')
AND
DDATE is Null
AND
PMTYPE IN (  'V', 'F')
AND "CHECKS" IN ( 'YES')
GROUP BY
EQUIPMENT

“select”中的非聚合列与“分组依据”中列出的列不匹配。您可以将 select 中的所有内容(LastCompleted 除外)添加到分组依据,或者从 select:

中删除一堆列
select
  EQUIPMENT,
  MAX(LastCompleted) as CDATE
from
--your subquery here
where STATUS in ('I','IDLE')
  and DDATE is Null
  and PMTYPE in ('V','F')
  and "CHECKS" in ('YES')
group by
  EQUIPMENT

如果您只想要每个 EQUIPMENT 具有最新 LastCompleted 的行应用 RANK/ROW_NUMBER:

SELECT
    SE.EquipmentSurfaceAssetBK AS "MRC",
    SE.EquipmentCodeBK AS "EQUIPMENT",
    SE.EquipmentDescription AS "DESCRIPTION",
    SE.EquipmentClassBK AS "CLASSCODE",
    SE.EquipmentCriticality AS "CRITICALITY",
    SE.EquipmentCostCode AS "COSTCODE",
    SE.EquipmentStatus AS "STATUS",
    PE.EqPMCodeBK AS "PM",
    PM.PMDescription AS "PMDESCRIPTION",
    PE.EqPMDueDate AS "NEXTDUE",
    PE.EqPMType AS "PMTYPE",
    PE.EqPMDeactivatedDate AS "DDATE",
    PE.EqPMAssignedBy AS "ASSIGNEDBY",
    PE.EqPMAssignedToResourceBK AS "ASSIGNEDTO",
    PE.EqPMFrequency AS "FREQUENCY",
    PE.EqPMFrequencyUOM AS "UOM",
    WO.WorkOrderEquipmentcodeBK AS "WOEQUIP",
    WO.WorkOrderCodeBK AS "WORKORDER",
    WO.WorkOrderPMCodeBK AS "WORKORDERPM",
    CASE
        WHEN WO.WorkOrderPMCodeBK = PE.EqPMCodeBK THEN 'YES' ELSE 'NO'
    END AS "CHECKS",
    WO.WorkOrderStatus AS "WOSTATUS",
    WO.WorkOrderCompletedDate AS "LastCompleted"
FROM IDW_PL_SURFACE.DIMSurfaceEquipment SE 
JOIN IDW_PL_SURFACE.DIMEquipmentPM PE
  ON SE.EquipmentCodeBK = PE.EqPMEquipmentCodeBK
JOIN IDW_PL_SURFACE.DIMSurfacePM PM
  ON PE.EqPMCodeBK = PM.PMCodeBK
JOIN IDW_PL_SURFACE.DIMWorkOrder WO
  ON SE.EquipmentCodeBK = WO.WorkOrderEquipmentcodeBK
WHERE 1=1
  AND STATUS IN ( 'I', 'IDLE')
  AND DDATE is Null
  AND PMTYPE IN (  'V', 'F')
  AND "CHECKS" IN ( 'YES')

QUALIFY RANK() OVER (PARTITION BY EQUIPMENT ORDER BY LastCompleted) = 1