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

标签 sql postgresql greatest-n-per-group

我对 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/

相关文章:

PostgreSQL 自定义周数 - 包含 2 月 1 日的第一周

sql - 如何在 SQL DB 上验证由连字符分隔的 2 年的 varchar 数据

python - 如何只删除 postgres 中的行而不是使用 pandas read_sql_query 方法删除表?

sql - 通过分组查找第二大值

php - 对获取的数据求和

SQLite 插入或替换位置

mysql - 根据相关性查找数据,然后从不同域中获取 2 个结果

mysql - 获取 MySQL 中每组的最新行

sql - 多语言列上的全文搜索索引

sql - 如何在 SQL Server 中截断日期时间?