将连接查询中的重复值限制为仅显示第一个实例
Posted
技术标签:
【中文标题】将连接查询中的重复值限制为仅显示第一个实例【英文标题】:Limit duplicated values in joined query to show only for first instance 【发布时间】:2021-10-25 21:13:27 【问题描述】:我以查询返回的方式连接两个表:
parent.name | child.name | child.col |
---|---|---|
First | A | foo |
Second | A | foo |
Third | A | foo |
Fourth | B | bar |
Fifth | C | baz |
Sixth | C | baz |
我只需要child.col
字段中的数据首次出现即可。
我尝试过使用 windows 或按child.name
分组并合并除第一行之外的所有内容,但我想到的最简单的解决方案是像这样计算每个唯一子项的索引:
parent.name | child.name | child.col | instance |
---|---|---|---|
First | A | foo | 1 |
Second | A | foo | 2 |
Third | A | foo | 3 |
Fourth | B | bar | 1 |
Fifth | C | baz | 1 |
Sixth | C | baz | 2 |
然后我可以使用 case 语句仅在 instance == 1
时显示 child.col
值。
我不知道如何实现这一点。我正在处理的真正查询是怪物,所以我必须展示的唯一代码是我为创建上述示例而编写的简单代码:
SELECT parent.name, child.name, child.col
FROM parent, child
WHERE parent.match = child.match
【问题讨论】:
【参考方案1】:首先,学习使用正确、明确、标准、可读的JOIN
语法。
其次,你可以使用row_number()
和case
:
SELECT p.name,
(CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.name ORDER BY p.name) = 1
THEN c.name
END) as name,
(CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.name ORDER BY p.name) = 1
THEN c.col
END) as col
FROM parent p JOIN
child c
ON p.match = c.match
ORDER BY c.name, p.name;
请注意,需要外部聚合以确保每个组中的“第一”行具有值。
【讨论】:
1) 这是一个简单的例子,真正的查询使用大男孩连接,但感谢您让我知道。 2)谢谢,这比我预期的要容易得多?️以上是关于将连接查询中的重复值限制为仅显示第一个实例的主要内容,如果未能解决你的问题,请参考以下文章