如果 GROUP BY 之后有 > 1 条记录,则显示 'MULTIPLE_VALUES' 而不是 LISTAGG
Posted
技术标签:
【中文标题】如果 GROUP BY 之后有 > 1 条记录,则显示 \'MULTIPLE_VALUES\' 而不是 LISTAGG【英文标题】:Show 'MULTIPLE_VALUES' instead of LISTAGG if there are > 1 records after GROUP BY如果 GROUP BY 之后有 > 1 条记录,则显示 'MULTIPLE_VALUES' 而不是 LISTAGG 【发布时间】:2021-08-25 16:31:44 【问题描述】:想象一下下面的表格:
我想获取每个国家/地区的总人口,但如果该城市是该国唯一的城市,我还想查看该城市的名称。
我可以运行类似的东西
select
min(Country),
listagg(City) within group as City,
sum(Population) as Population
from table1
group by Country
但我想要的是('MULTIPLE' 只是我想查看的文本示例,而不是城市列表)
我该怎么做?
我找不到任何解决方案,我唯一的想法是将 CASE 与 COUNT 一起使用,但它不起作用
附:格式化很抱歉
【问题讨论】:
能否请您格式化您的问题 完成,对不起!我不得不用屏幕截图替换表格我不知道为什么它不起作用 - 我的问题的预览看起来很好 你可以试试下面的代码,看看它是否有效?如果没有,请分享您在运行时看到的内容 【参考方案1】:只需计算城市或比较最小和最大城市:
select
country,
case when min(city) = max(city) then min(city) else 'multiple' as city,
sum(population) as population
from cities
group by country
order by country;
【讨论】:
谢谢!我尝试了类似的方法,但没有成功,但您的解决方案完全符合我的预期【参考方案2】:假设你不会让同一个城市出现两次
代码 1
WITH list_of_cities_ as (
SELECT
COUNTRY,
city,
count(city) over (partition by country) AS TOTAL_Cities,
SUM(POPULATION) over (partition by country) AS TOTAL_POPULATION
FROM table_
)
select
DISTINCT
country,
case when TOTAL_Cities > 1 THEN 'Multiple' Else city end as city,
TOTAL_POPULATION
from list_of_cities_
代码 2
如果您有兴趣获取所有城市的列表,而不是关键字 “多个”
https://dbfiddle.uk/?rdbms=postgres_9.5&fiddle=68efe08ab72ef63afa5813925e7f99e0
SELECT
COUNTRY,
STRING_AGG(City,',') as LIST_OF_CITIES,
SUM(POPULATION) AS TOTAL_POPULATION
FROM table_
GROUP BY 1
【讨论】:
是的,但是外连接和DISTINCT
在您的原始查询中仍然是多余的。您从 table_ 中选择一个城市。那个城市行有一个国家。您将国家的城市列表和人口行加入城市行。你为什么要加入那个国家? list_of_cities_ 中怎么可能不存在那个国家?如果你把那个城市的国家加入到城市中,那怎么会导致重复呢?
@ThorstenKettner 你会明白,如果你运行这个代码:dbfiddle.uk/… 正如你从小提琴中看到的那样,这个国家会产生重复,因此需要区分
@ThorstenKettner 你对小提琴有什么看法?如果您可以取消标记无用的按钮,也将不胜感激,因为答案很好
好的,抱歉,我没看到你没有选择城市。您加入 city 表只是为了再次从查询中删除其内容。所以,是的,DISTINCT
是必要的,因为您有一个古怪的查询。我建议您使用此经验法则:如果您SELECT DISTINCT
,您很可能正在与您自己在查询中创建的不必要的大中间结果作斗争。 SELECT DISTINCT
非常非常经常是查询写得不好的指标。所以,看看查询是重复的来源。然后重写查询,以免一开始就产生它们。
@ThorstenKettner 感谢您的反馈,非常感谢 :) 是的一种方法是使用 rank() ,请参阅:dbfiddle.uk/… 但您的解决方案要短得多。以上是关于如果 GROUP BY 之后有 > 1 条记录,则显示 'MULTIPLE_VALUES' 而不是 LISTAGG的主要内容,如果未能解决你的问题,请参考以下文章
MySQL根据某字段分组(group by)之后再根据另外的字段排序(order by)