我有一个表,其中包含文本数据,其中包含一堆不同语言的翻译。每个翻译都是针对特定标签的。
我需要生成一个数据透视表,以便快速获取缺少的内容。
记录的一个例子是
1, en, hello
1, fr, bonjour
1, es, hola
2, en, how are you
2, fr,
3, es, come es stas
Run Code Online (Sandbox Code Playgroud)
尽管所有语言的翻译都应始终存在,但我不能 100% 确定情况确实如此。因此必须考虑缺失字段。
想要的结果是这样的
|ID|EN|FR|ES|
|1|hello|bonjour|hola|
|2|how are you| |come es stas|
Run Code Online (Sandbox Code Playgroud)
我面临的挑战是填充数据库时列顺序可能并不总是相同,因此理论上我应该有一个动态字段列表。
SQLite 中没有直接的 PIVOT 函数,因此我开始尝试使用 group_concat 获取逗号分隔的字符串。
SELECT DISTINCT language, group_concat(word, ',') OVER (PARTITION BY language) AS group_concat
FROM vocabulary;
Run Code Online (Sandbox Code Playgroud)
如果需要的话,我可以稍后在 Python 中运行结果;问题是任何缺失值都不会附加空项,从而将所有串联移动 n,从而使该解决方案无效。
我还尝试在选择谓词中使用过滤子句(尽管这意味着对列进行硬编码),但我未能成功。
关于如何实现这一目标有什么想法吗?
以下查询将返回没有所有翻译的所有 ID:
SELECT id, COUNT(*) AS count
FROM vocabulary
GROUP BY id
HAVING count < (SELECT COUNT(DISTINCT language)
FROM vocabulary);
Run Code Online (Sandbox Code Playgroud)
如果您想知道每个 ID 缺少哪些语言,请使用复合查询来查找所有语言列表中但不在该 ID 的语言列表中的语言:
WITH missing_ids AS (
SELECT id, COUNT(*) AS count
FROM vocabulary
GROUP BY id
HAVING count < (SELECT COUNT(DISTINCT language)
FROM vocabulary)
)
SELECT id,
(SELECT group_concat(language)
FROM (SELECT DISTINCT language FROM vocabulary
EXCEPT
SELECT language FROM vocabulary WHERE id = missing_ids.id)
) AS missing_languages
FROM missing_ids;
Run Code Online (Sandbox Code Playgroud)