我对 SQL 不太熟悉,并且遇到了重复删除问题,需要一些帮助。
我有两个表,如下:
config -> ID -----------
-> timestamp |
-> vcsID |
-> platform |
|
data -> ID |
-> configID <-----
-> value
对于配置表中的每一行,数据表中可能有多行,连接是:
data.configID = config.ID
但是,在配置表中可能存在 vcsID 未高级的条目(这些条目表示在来 self 们的版本控制系统的相同代码上构建,“值”表示构建指标,例如内存大小);它们不是重复的行,因为时间戳会不同,但我需要删除它们。我想创建一个数据 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/