在 Postgresql 中选择位掩码

发布于 2024-12-24 20:32:14 字数 361 浏览 0 评论 0原文

我有一个包含“一”和“二”列的表:

a | x  
a | y  
a | z  
b | x  
b | z  
c | y  

我想编写一个查询来补充缺少的嵌套值

b | null | y  
c | null | x  
c | null | z  

然后我将使用 array_agg(two) group by one 选择它,这样

a {1 1 1}  
b {1 0 1}  
c {0 1 0}

最终使用 COPY 查询将其导出到 CSV 文件中

第一步我应该编写什么查询?

I have a table with columns "one" and "two":

a | x  
a | y  
a | z  
b | x  
b | z  
c | y  

I want to write a query to complement it with missing nested values

b | null | y  
c | null | x  
c | null | z  

Then I will select it with array_agg(two) group by one, such that

a {1 1 1}  
b {1 0 1}  
c {0 1 0}

And eventually export it in a CSV file with COPY query

What query should I write for the first step?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

七颜 2024-12-31 20:32:15

您可以使用 CROSS JOIN 构建所有可能的元素对,然后使用 LEFT JOIN 检查每对元素是否存在:

SELECT
    T1.one,
    T2.two,
    CASE WHEN your_table.one IS NULL THEN 0 ELSE 1 END AS is_present
FROM (SELECT DISTINCT one FROM your_table) T1
CROSS JOIN (SELECT DISTINCT two FROM your_table) T2
LEFT JOIN your_table
ON T1.one = your_table.one AND T2.two = your_table.two

然后您可以添加 GROUP BY T1.oneARRAY_AGG (...) 到此查询。

You can use a CROSS JOIN to build all the possible pairs of elements then a LEFT JOIN to check if each pair of elements exists:

SELECT
    T1.one,
    T2.two,
    CASE WHEN your_table.one IS NULL THEN 0 ELSE 1 END AS is_present
FROM (SELECT DISTINCT one FROM your_table) T1
CROSS JOIN (SELECT DISTINCT two FROM your_table) T2
LEFT JOIN your_table
ON T1.one = your_table.one AND T2.two = your_table.two

You can then add a GROUP BY T1.one and an ARRAY_AGG(...) to this query.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文