Вывести текст с минимальной длинной в сгруппированный запрос
Есть таблица facts
| subject_id | fact_id | description |
|---|---|---|
| subject_1 | fact_20 | A |
| subject_1 | fact_21 | AB |
| subject_2 | fact_31 | ABCD |
| subject_2 | fact_20 | AD |
Мне нужно посчитать сколько fact_id есть в каждом subject_id и вывести для него описание, содержащее минимальное количество символов.
Понятно, что надо использовать что-то вроде этого:
select subject_id, count (*) as facts
from facts
group by subject_id
Получаю:
| subject_id | facts |
|---|---|
| subject_1 | 2 |
| subject_2 | 2 |
Подскажите, пожалуйста, как туда же засунуть минимальный description, чтобы получилось
| subject_id | facts | description |
|---|---|---|
| subject_1 | 2 | A |
| subject_2 | 2 | AD |
Ответы (2 шт):
Автор решения: Akina
→ Ссылка
SELECT DISTINCT
subject_id,
COUNT(*) OVER (PARTITION BY subject_id) facts,
FIRST_VALUE(description) OVER (PARTITION BY subject_id
ORDER BY LENGTH(description)) description
FROM facts;
Если несколько записей содержат описания одинаковой и одновременно минимальной длины - выведется случайное из них. Нужно определённое - расширьте сортировку.
Автор решения: pegoopik
→ Ссылка
Всё же я не уверен в DISTINCT, работать конечно будет, но как-то велосипедно, задача явно на группировку.
SELECT subject_id, COUNT(*) facts, MAX(CASE WHEN N=1 THEN description END)description
FROM(
SELECT subject_id, ROW_NUMBER()OVER(PARTITION BY subject_id
ORDER BY LENGTH(description))N, description
FROM facts
)T
GROUP BY subject_id