У меня есть таблица вроде этого:
Table: p
+----------------+
| id | w_id |
+---------+------+
| 5 | 8 |
| 5 | 10 |
| 5 | 8 |
| 5 | 10 |
| 5 | 8 |
| 6 | 5 |
| 6 | 8 |
| 6 | 10 |
| 6 | 10 |
| 7 | 8 |
| 7 | 10 |
+----------------+
Каков лучший SQL, чтобы получить следующий результат?
+-----------------------------+
| id | most_used_w_id |
+---------+-------------------+
| 5 | 8 |
| 6 | 10 |
| 7 | 8 |
+-----------------------------+
Другими словами, чтобы получить, за id
, наиболее часто встречающийся w_id
.
Обратите внимание, что в приведенном выше примере id
7 относится к 8 раз и 10 раз.
Таким образом, либо (7, 8), либо (7, 10) будут делать результат. Если невозможно
забрать один, то оба (7, 8) и (7, 10) в наборе результатов будут в порядке.
Я придумал что-то вроде:
select counters2.p_id as id, counters2.w_id as most_used_w_id
from (
select p.id as p_id,
w_id,
count(w_id) as count_of_w_ids
from p
group by id, w_id
) as counters2
join (
select p_id, max(count_of_w_ids) as max_counter_for_w_ids
from (
select p.id as p_id,
w_id,
count(w_id) as count_of_w_ids
from p
group by id, w_id
) as counters
group by p_id
) as p_max
on p_max.p_id = counters2.p_id
and p_max.max_counter_for_w_ids = counters2.count_of_w_ids
;
но я не уверен, что это лучший способ сделать это. И я должен был повторить один и тот же подзапрос два раза.
Лучшее решение?