【问题标题】:SQL Selected non-aggregate values must be part of the associated groupSQL 选定的非聚合值必须是关联组的一部分
【发布时间】:2021-12-17 02:59:59
【问题描述】:

我没有得到我在这里缺少的东西。对我来说,似乎我在 select 语句中包含了每个非聚合值

SELECT TOP 5
    f_ev2.Identifier,
    AVG(f_ev2.Identifier) AS Identifier,
    MIN(f_ev2.Event_dtm) AS Erster_PZ_Scan
FROM DB_DWH_MART_AKM_PLT.VW_F_EVENT f_ev2
INNER JOIN
    (
        SELECT 
        DISTINCT f_ev.AUFTRAGGEBER_EKP AS EKP
        FROM    DB_DWH_MART_AKM_PLT.VW_F_EVENT f_ev
        WHERE f_ev.PROCESS_NO = 1075
    ) AS manifest_users
ON f_ev2.AUFTRAGGEBER_EKP = manifest_users.EKP
WHERE f_ev2.event_dtm BETWEEN (date -1) AND  (date -10)
GROUP BY f_ev2.Identifier
HAVING (f_ev2.PROCESS_NO = 1 OR f_ev2.PROCESS_NO = 2)

我为什么会得到

SQL Selected non-aggregate values must be part of the associated group

【问题讨论】:

  • A HAVING 通常用于聚合函数,如 AVG、MIN。因此,PROCESS_NO 的标准应该在 WHERE 子句中。另外,您认为这有意义吗:SELECT x, AVG(x) FROM t GROUP BY x
  • @LukStorms 你说得对,谢谢指出!

标签: sql group-by teradata


【解决方案1】:

聚合之后没有更多细节,即f_ev2.PROCESS_NO

您可以将条件移动到 WHERE

AND f_ev2.PROCESS_NO IN (1, 2)

或应用聚合函数,例如

HAVING MIN(f_ev2.PROCESS_NO IN (1, 2)

但是下面的条件总是会返回一个空的结果集,Explain 会显示一个无法满足的条件

WHERE f_ev2.event_dtm BETWEEN (date -1) AND  (date -10)

您必须切换日期:

WHERE f_ev2.event_dtm BETWEEN (current_date -10) AND  (current_date -1)

【讨论】:

  • 您知道是否可以将查询(例如 2 和 3 之类的两个值)组合在一起并为值 4 单独列出?
  • 你的意思是select case when col IN (2,3) then '2/3' when col = 4 then '4' end as grp .... group by grp
  • 是的,这是一种可能性
猜你喜欢
  • 2013-06-27
  • 1970-01-01
  • 2020-10-23
  • 2018-10-18
  • 2015-10-05
  • 2020-05-14
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多