gpt4 book ai didi

sql - 如何在删除一个表的一列中的重复条目的同时连接两个表

转载 作者:行者123 更新时间:2023-11-29 12:12:36 25 4
gpt4 key购买 nike

我对 SQL 不是很熟悉,遇到了一个重复删除问题,我需要一些帮助。

我有两个表如下:

config -> ID  -----------
-> timestamp |
-> vcsID |
-> platform |
|
data -> ID |
-> configID <-----
-> value

对于配置表中的每一行,数据表中可能有多行,连接是:

data.configID = config.ID

但是,在配置表中,可能存在 vcsID 未提升的条目(这些条目表示基于我们版本控制系统的相同代码构建,“值”表示构建指标,例如内存大小);它们不是重复的行,因为时间戳会不同,但我需要摆脱它们。我想创建一个删除这些重复项的数据 View 。我该怎么做呢?在 MySQL 中,我可以执行以下操作:

select *
from (select * from config group by vcsID) as filtered
inner join data
on data.configID = filtered.ID

...但是 Postgres 严格遵守 SQL 标准并要求 Select 子句中的任何内容都必须在 Group By 子句中,因此我无法从子查询中获取 ID 字段来进行连接。

例如,一些示例数据可能是:

config
ID timestamp vcsID platform
1 1/1/2014 09:00 18 "x"
2 1/1/2014 20:20 30 "y"
3 1/1/2014 20:25 30 "y"
4 1/1/2014 20:40 31 "y"

data
ID configID value
12 1 40000
13 2 125
14 3 125
15 4 130

...并且,将平台“y”作为我感兴趣的东西,我想出去的是:

               config                 |         data
ID timestamp vcsID platform | ID configID value
2 1/1/2014 20:20 30 "y" | 13 2 125
4 1/1/2014 20:40 31 "y" | 15 4 125

或者,等价地:

               config                 |         data
ID timestamp vcsID platform | ID configID value
3 1/1/2014 20:25 30 "y" | 14 3 125
4 1/1/2014 20:40 31 "y" | 15 4 125

非常感谢任何帮助。

最佳答案

使用DISTINCT ON:

SELECT DISTINCT ON (vcsID) *
FROM config c
JOIN data d ON d.configID = c.ID
ORDER BY vcsID, "timestamp" DESC;

假设您要从每组相同的 vcsID 中选择最新的行,因此 ORDER BY。如果您真的不关心为每个 vcsID 获取哪一行,则不需要 ORDER BY。无论哪种方式,ORDER BY 中的前导列都必须匹配 DISTINCT ON 表达式,因此您不能像您看起来那样 ORDER BY c.id想。您需要将其包装在子查询中并在外部查询中排序。

DISTINCT ON 和替代解决方案的详细说明:

另外:不要使用像 timestamp 这样的基本类型名称作为标识符。

关于sql - 如何在删除一个表的一列中的重复条目的同时连接两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25186313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com