После получения максимальной записи на карте вы должны преобразовать ее в карту с одной записью. Для этого вы можете использовать Collections.singletonMap()
Map<String, List<Person>> mapOfMostPopulatedCity = persons.stream()
.collect(Collectors.groupingBy(Person::getCity)).entrySet().stream()
.max(Comparator.comparingInt(e -> e.getValue().size()))
.map(e -> Collections.singletonMap(e.getKey(), e.getValue()))
.orElseThrow(IllegalArgumentException::new);
С Java9 вы можете использовать Map.of(e.getKey(), e.getValue())
для построения карты с одной записью.
select a,count(distinct isnull(b,-1))-sum(distinct case when b is null then 1 else 0 end),sum(a) from
(select 1 a,1 b union all
select 2,2 union all
select 2,null union all
select 3,3 union all
select 3,null union all
select 3,null) a
group by a
Благодаря Эоину я нашел способ сделать это. Вы можете подсчитать различные значения, включая нули, а затем удалить счетчик из-за нулей, если они были, с использованием отдельной суммы.
Везде, где вы, возможно, вернули нуль, используйте
CASE WHEN Column IS NULL THEN -1 ELSE Column END AS Column
Это выведет все ваши нулевые значения для -1 на время запроса, и они будут подсчитываться / агрегироваться как таковые, тогда вы можете просто сделать обратное в своем запросе точной упаковки ...
SELECT
CASE WHEN t1.a = -1 THEN NULL ELSE t1.a END as a
, t1.countdistinctb
, t2.suma
Если вам не нравится дублирование кода, почему бы не использовать общее табличное выражение? например,
WITH x(a, b) AS
(
select 1 a,1 b union all
select 2,2 union all
select 2,null union all
select 3,3 union all
select 3,null union all
select 3,null
)
select t1.a, t1.countdistinctb, t2.suma from
(
select a,count(distinct b) countdistinctb from
x a
where a.b is not null
group by a
) t1
left join
(
select a,sum(a) suma from
x a
group by a
) t2 on t1.a=t2.a