Рассчитайте отличное и Нулевое значение устраняется агрегатом

После получения максимальной записи на карте вы должны преобразовать ее в карту с одной записью. Для этого вы можете использовать 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()) для построения карты с одной записью.

7
задан Simon D 12 May 2009 в 07:55
поделиться

3 ответа

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

Благодаря Эоину я нашел способ сделать это. Вы можете подсчитать различные значения, включая нули, а затем удалить счетчик из-за нулей, если они были, с использованием отдельной суммы.

6
ответ дан 6 December 2019 в 23:13
поделиться

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

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
2
ответ дан 6 December 2019 в 23:13
поделиться

Если вам не нравится дублирование кода, почему бы не использовать общее табличное выражение? например,

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
1
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: