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

时间:2014-08-07 15:23:12

标签: sql postgresql greatest-n-per-group

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

我有两张表如下:

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

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

data.configID = config.ID

但是,在配置表中可能存在vcsID尚未高级的条目(这些条目表示来自我们的版本控制系统的相同代码的构建,'value'表示构建度量,例如内存大小);它们不是重复行,因为时间戳会有所不同,但我需要摆脱它们。我想创建一个删除这些重复项的数据视图。我该怎么做呢?在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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

使用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等基本类型名称作为标识符。

答案 1 :(得分:0)

尝试此查询:

选择distinct on(vscID)* 来自配置c 在d.configID = c.ID上连接数据d 其中c.platform =&#34; y&#34;

它应该给你你想要的东西。 &#34;不同于(列......)&#34;根据特定列删除重复项。