выберите последние 2 строки created_at и среднее значение поля mysql

#mysql

#mysql

Вопрос:

моя таблица1 :

 id name

11   a
12   b
13   c
14   d
 

моя таблица2 :

 id table1_id  price   created_at

1   11         10    2020-11-19
2   11         12    2020-11-20
3   11         14    2020-11-21
4   11         16    2020-11-22
2   12         10    2020-11-16
3   12         12    2020-11-17
4   12         14    2020-11-18
2   13         16    2020-11-19
3   13         18    2020-11-20
4   13         20    2020-11-21
2   13         22    2020-11-22
2   14         10    2020-11-17
3   14         12    2020-11-18
4   14         14    2020-11-19
2   14         16    2020-11-20
3   14         18    2020-11-21
4   14         20    2020-11-22
 

я хочу выбрать среднее значение 2, последнее созданное идентификатором tabel 1

например, table_id = 11 => среднее значение (16 14) = 15

Результат :

 table1_id  avg
11          15
12          13
13          21
14          19
 

Я пытаюсь это :

 SELECT
subq.table1_id,avg( subq.price ) 
FROM
( SELECT price,table1_id FROM table2 WHERE table1_id = 11 ORDER BY created_at DESC LIMIT 2 ) AS subq
GROUP BY subq.table1_id
 

это возвращает только одну строку, потому что use => ГДЕ table1_id = 11

но я хочу, чтобы все средние цены table_id 11,12,13,14 в одной таблице

Комментарии:

1. Обратите внимание, что по соглашению вызываемые столбцы id являются ПЕРВИЧНЫМИ. Это может сбить с толку вашу аудиторию, если вы будете относиться к ним иначе.

Ответ №1:

Для MySQL 8.0 вы можете сделать это с ROW_NUMBER() помощью функции window:

 SELECT table1_id, AVG(price) avg_price
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY table1_id ORDER BY created_at DESC) rn
  FROM table2
) t
WHERE rn <= 2
GROUP BY table1_id
 

Смотрите демонстрацию.

Ответ №2:

Вы можете использовать оператор ‘in’, например:

 WHERE table1_id in (11,12,13,14) 
 

таким образом, он выберет, является ли идентификатор одним из них,
более уродливым подходом было бы использовать оператор ‘or’

 WHERE table1_id = 11 or table1_id = 12 or table1_id = 13 or table1_id = 14