Ошибка с агрегатной функцией в операторе CASE и предложении GROUP BY - PullRequest
2 голосов
/ 07 июня 2019

У меня есть следующий CTE, который я использую в запросе большего размера, и я получаю два разных сообщения об ошибках в зависимости от того, как я группируюсь.

Я на Redash и использую Amazon Athena.Я могу группировать по tenant_id или я могу группировать по tenant_id и своему кейсу с именем "active".В любом случае я получу ошибку.

active_billpay AS
  (SELECT o.tenant_id as tenant_id, CASE WHEN o.created_date >= min(mbpc.created_date) 
     THEN true else false end as active
    FROM reporting.t_order o
    LEFT JOIN reporting.t_me_bill_pay_charge mbpc ON o.tenant_id = mbpc.tenant_id
      WHERE o.retired_date is null
        AND mbpc.retired_date is null
    GROUP by 1),

Если я сгруппирую только по tenant_id:

Ошибка при выполнении запроса: SYNTAX_ERROR: строка 13:32: '(CASE WHEN ("o "." creation_date "> =" min "(" mbpc "." creation_date ")) THEN true ELSE false END) 'должно быть составным выражением или появляться в предложении GROUP BY

Если ягруппировка по tenant_id и active:

Ошибка при выполнении запроса: SYNTAX_ERROR: строка 13:32: предложение GROUP BY не может содержать агрегаты или оконные функции: ["min" ("mbpc". "made_date")]

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Я думаю, вы просто хотите агрегировать по tenant_id и created_date:

 SELECT o.tenant_id as tenant_id,
        (CASE WHEN o.created_date >= MIN(mbpc.created_date) THEN true ELSE false
         END) as active
 FROM reporting.t_order o LEFT JOIN
      reporting.t_me_bill_pay_charge mbpc
      ON o.tenant_id = mbpc.tenant_id
 where o.retired_date is null
 and mbpc.retired_date is null
 group by o.tenant_id, o.created_date
0 голосов
/ 07 июня 2019

Чтобы применять агрегатные функции, такие как min, SQL требует, чтобы вы были очень точны в отношении того, к какому набору данных относится агрегат. Даже если SQL разрешит написанный вами запрос, вы все равно получите минимальный created_date для каждой строки, а не для каждой tenant_id.

Чтобы сделать то, что, я думаю, вы пытаетесь сделать, вы должны использовать подзапрос, чтобы получить минимальное значение created_date для каждого tenant_id, а затем использовать это значение в своем поле active.

SELECT o.tenant_id AS tenant_id,
       CASE WHEN o.created_date >= min_created_date THEN TRUE ELSE FALSE END AS active
FROM   reporting.t_order o
       LEFT JOIN
       (SELECT tenant_id, MIN (created_date) AS min_created_date
        FROM   reporting.t_me_bill_pay_charge
        WHERE  retired_date IS NULL) mbpc
           ON o.tenant_id = mbpc.tenant_id
WHERE  o.retired_date IS NULL

Как правило, если вы пытаетесь обмануть требования к синтаксису SQL, выполняя что-то вроде group by 1, это явный признак того, что ваш подход некорректен.

...