我在Postgres中有以下表结构:
Column | Type
-----------------+------------------------
alternatenameid | integer
geonameid | integer
isolanguage | character varying(7)
alternatename | character varying(300)
ispreferredname | boolean
isshortname | boolean
为简单起见,我们说我们有以下数据:
alternatenameid | geonameid | isolanguage | alternatename | ispreferredname | isshortname
-----------------+-----------+-------------+-----------------------+-----------------+------------
2421691 | 1835841 | es | Corea, República de | t |
1562679 | 1835841 | es | Corea del Sur | | t
1562677 | 1835841 | en | South Korea | | t
8103216 | 1835841 | en | Korea, Republic of | |
该表存储了地名的翻译字符串,其中每个地名(在本例中为韩国)都有一个独特的地理位置(1835841)。每个地名都可能有不同语言的翻译,由isolanguage列定义,这些翻译的名称可以是首选名称(boolean ispreferredname),短名称(boolean isshortname),或者两者都不是(两个字段都是NULL)。我无法使用以下结构从此数据创建新表:
Column | Type
-----------------+------------------------
id | integer
geonameid | integer
isolanguage | character varying(7)
alternatename | character varying(300)
preferredname | character varying(300)
shortname | character varying(300)
以下数据:
id | geonameid | isolanguage | alternatename | preferredname | shortname
-------+-----------+-------------+-----------------------+---------------------+---------------
(int) | 1835841 | es | | Corea, República de | Corea del Sur
(int) | 1835841 | en | Korea, Republic of | | South Korea
如果核心结构基于(DISTINCT geonameid,isolanguage),而preferredname和shortname包含ispreferredname和isshortname行的字符串,则如果不存在ispreferredname和isshortname,则alternatename包含相应的字符串。我不熟悉复杂的JOIN或Sub-SELECT子句,我将非常感谢你的帮助。
戈登指出,这可以通过条件汇总来实现:
SELECT geonameid, isolanguage,
MAX(CASE WHEN ispreferredname IS TRUE OR isshortname IS TRUE THEN NULL
ELSE alternatename
END) AS alternatename,
MAX(CASE WHEN ispreferredname IS TRUE THEN alternatename
END) AS preferredname,
MAX(CASE WHEN isshortname IS TRUE THEN alternatename
END) AS shortname
FROM table t
GROUP BY geonameid, isolanguage;
答案 0 :(得分:2)
我相信你可以通过条件聚合来做到这一点:
select geonameid, isolanguage,
max(case when ispreferredname = t or isshortname = t then NULL
else alternatename
end) as alternatename,
max(case when ispreferredname = t then alternatename
end) as preferredname,
max(case when isshortname = t then alternatename
end) as shortname
from table t
group by geonameid, isolanguage;
第一个条件有点棘手,因为我不知道当标志不是t
时标志会采用什么值。如果它们是空格,空字符串或NULL
s。