MariaDB: выберите val_1, max (value_2), сгруппируйте по value_3 - PullRequest
0 голосов
/ 23 января 2020

У меня есть следующие столбцы:

| order_id | client_id | order_timestamp | buyer_id | (все INT)

Все началось с простой задачи "Покажите мне покупателя последнего заказа для каждого клиента", так что в основном

SELECT
    client_id,
    max(order_timestamp),
    buyer_id
FROM table t
GROUP BY client_id;

, если GROUP BY будет работать так, как можно было бы ожидать / wi sh. Я знаю, что это типичная проблема, но я никогда не видел такого случая, в частности, когда вам нужно другое значение в дополнение к тому, по которому вы группируете. Я думаю, что использование оконных функций могло бы помочь, но мы используем MariaDB 10.0, так что это не совсем вариант. Я пробовал разные подвыборы и объединения, но это всегда заканчивается проблемой, заключающейся в том, что я не могу использовать order_id для присоединения, так как мне приходится группировать по client_id. Мне также пришло в голову присоединиться, используя client_id AND order_timestamp, но эта комбинация не является уникальной в таблице, поскольку можно иметь заказы с одинаковой (Unix) отметкой времени для одной комбинации клиента или клиента / покупателя (так что да , это был бы крайний случай, мне понадобился бы покупатель заказа с более высоким порядковым номером, но это проблема для другого дня, я думаю).

Если таблица была заполнена как

| order_id | client_id | order_timestamp | buyer_id  |
|     1    |     123   |     9876543     |    2      |
|     2    |     123   |     9876654     |    3      |
|     3    |     234   |     9945634     |    2      |
|     4    |     234   |     9735534     |    1      |

Я хотел бы получить

| client_id | buyer_id |
------------|----------|
|     123   |    3     |
|     234   |    2     |

Надеюсь, кто-нибудь может мне помочь, поэтому я могу go спать спокойно сегодня вечером.

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Если вы используете max (поле), будет выбран первый столбец условия группы. В вашем случае сначала указывается client_id для каждой группы, а это не то, что вам нужно.

Попробуйте это.

select client_id, order_timestamp, buyer_id from t
  where order_timestamp= 
     (select max(ot) from t as tcopy where tcopy.client_id= t.client_id ) 
  group by client_id;
0 голосов
/ 23 января 2020

Если ваша версия MariaDB поддерживает оконные функции, вы можете использовать ROW_NUMBER():

select t.client_id, t.buyer_id
from (
  select *,
    row_number() over (partition by client_id order by order_timestamp desc, order_id desc) rn
  from tablename
) t
where t.rn = 1

См. demo . Результаты:

| client_id | buyer_id |
| --------- | -------- |
| 123       | 3        |
| 234       | 2        |

Без использования оконных функций NOT EXISTS:

select t.client_id, t.buyer_id
from tablename t
where not exists (
  select 1 from tablename
  where client_id = t.client_id 
  and (
    order_timestamp > t.order_timestamp 
    or (order_timestamp = t.order_timestamp and order_id > t.order_id)
  )  
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...