Group by и агрегатная функция с условием

Предпложим Имеется таблица test

            ID  |   createdDate |   productId   |   customerId  |
            1   |'2020-01-01'   |       1       |       1       |
            1   |'2020-01-01'   |       2       |       2       |
            1   |'2020-01-01'   |       3       |       1       |
            1   |'2020-01-01'   |       4       |       3       |
            1   |'2020-01-01'   |       5       |       2       |
            1   |'2020-01-01'   |       4       |       3       |
            1   |'2020-08-01'   |       3       |       1       |
            1   |'2020-08-02'   |       6       |       1       |
            1   |'2020-05-01'   |       3       |       1       |

для этой таблиц написал следующий запрос:

select sum(if(newer=1,1,0)) newerCount, sum(if(newer=0 and older>0,1,0)) olderCount
from (
select
    sum(if(t.createdDate> TIMESTAMPADD(DAY, -20, NOW()),1,0)) newer,
    sum(if(t.createdDate< TIMESTAMPADD(DAY, -20, NOW()),1,0)) older
from test t where customerId=1 group by productId) result

Хочу понять, как работает в этом случае group by.

Вопрос возник, когда при включенном mysql=only_full_group_by, я начал получать следующую ошибку this is incompatible with sql_mode=only_full_group_by. Вроде бы при отключенном only_full_group_by получаю ожидаемый результат.

Правильно ли я понимаю что этот запрос будет работать следующим образом:

  1. создаст группу продуктов (productId). Тогда в группе productId=3 будут три записи
  2. поочередно выберет createDate из этих записей и вставит в агрегатные функции sum(if(t.createDate> TIMESTAMPADD(DAY, -20, NOW()),1,0)) и sum(if(t.createdDate< TIMESTAMPADD(DAY, -20, NOW()),1,0)) ? Или возмет первую попавшую createdDate?

Если createDate выбирает поочередно, тогда почему при включеном sql_mode=only_full_group_by получаю ошибку?


Ответы (1 шт):

Автор решения: Peter1

Запрос рабочий, посмотрите по ссылке из комментария Akina и вставте там запрос, который не работает.

select sum(if(newer=1,1,0)) newerCount, sum(if(newer=0 and older>0,1,0)) olderCount
from (
select
    sum(if(t.createdDate> TIMESTAMPADD(DAY, -20, NOW()),1,0)) newer,
    sum(if(t.createdDate< TIMESTAMPADD(DAY, -20, NOW()),1,0)) older
from test t where customerId=1 group by productId) result
→ Ссылка