Вывести текст с минимальной длинной в сгруппированный запрос

Есть таблица 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
→ Ссылка