我对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
非常感谢任何帮助。
答案 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;根据特定列删除重复项。