#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