Таблица такая:
ratio|user
0.1|2
0.3|2
1 |2
1 |2
0.4|3
0.7|3
Запрос должен возвращать для каждого пользователя либо число раз, когда отношение равно 1, либо, если для этого пользователя нет отношения 1, максимальное соотношение. Итак, учитывая приведенную выше таблицу, запрос должен вернуть:
2|2
3|0.7
потому что есть два значения "1" для отношения для пользователя 2, а самое высокое соотношение для пользователя 3 составляет 0,7.
На данный момент у меня есть select user,count(ratio) from table where ratio = 1 group by user;
, но, очевидно, это не соответствует второй части требования. Должен ли я сделать подтаблицу, уже заполненную результатом этого первого запроса...?
Используйте выражение CASE
, чтобы выбрать между количеством и максимальным значением:
SELECT user, CASE WHEN SUM(ratio = 1) > 0
THEN SUM(ratio = 1) ELSE MAX(ratio) END AS ratio
FROM yourTable
GROUP BY user;
Я думаю, что это можно сделать в 2 этапа, например:
select user,count(ratio) as column2 from table where ratio = 1 group by user
union
select user,max(ratio) as column2 from table where ratio <> 1 group by user
Ааа спасибо! В сумме есть условное выражение ... На самом деле, если вы не возражаете против дополнительного столбца в результате, это также можно записать как
select user, sum(ratio=1), max(ratio) from table group by user;
, что, возможно, легче читать.