0

我在 postgres 数据库中收集了大量数据,我想在其中对特定年龄的数据进行核对......但我希望它对来自任何给定位置和站点组合的最新数据迭代进行核对。

基本上,我有一个非常大的表,其中有一个location (bigint), site (bigint),readdate (bigint)和一些附带的数据(注意:给定站点、位置和 readdate 会有多个条目 - 但同一个 readdate 上的任何内容都被认为是相同的扫描,并且需要保留在给定的位置)。

目前,我刚刚将其设置为摆脱所有旧记录......但是存在特定站点和位置组合将停止提供数据一段时间的可能性,如果我想保留最终状态那个会发生。我正在从 php 执行 SQL 查询,所以我很确定我可以将一些非常丑陋的代码组合在一起,找到任何给定站点和位置组合的最新读取日期,然后删除比该位置更年轻的内容,或者删除基于日历限制(以较小的日期为准),但我更愿意将决策工作量放在 SQL 查询中,而不是必须首先获取所有位置、站点和 max(readdate) 条目的列表,然后在 php 中对它们进行迭代,进行单独的删除查询。

我当前的查询(它没有做我想要的,因为它删除了 $limit 之前的所有内容)由以下声明声明:

$query="DELETE FROM votwdata WHERE readdate < '".$limit."';";
  • 有什么好的修改的想法吗?
4

1 回答 1

1

如果我了解您要执行的操作,则您有许多字段可能相同,并且您希望保留最新记录。假设您在每条记录上都有一个顺序 ID 或 created_at,您可以运行一个子查询来标识您要删除的记录。例如:

按data1,data2从表组中选择max(id),data1,data2;

这将提取唯一 data1 和 data2 的最新记录。您可以将其作为内联查询运行,将其连接回原始表。

select t.* from table t, (select max(id) "id",data1,data2 from table group by data1,data2) t2 where t.id=t2.id;

这将为您提供最新的记录。您可以进行左连接并查看空值以删除您不喜欢的任何内容。

select t.id,t2.id from table t left join (select max(id) "id",data1,data2 from table group by 2,3) t2 on t.id=t2.id where t2.id is null;

这为您提供了所有要删除的记录。

好吧,这就是肮脏的方式——重构掉。

于 2013-07-31T23:49:54.443 回答