1

我有一个 postgres 表,它代表我表中“元素”的历史记录。一个元素由 2 列的分组决定

历史数据具有诸如“已保存”或“已删除”之类的操作,对于任何元素都可能发生多次。这些是相互排斥的,所以当我查看当前状态时,请关注最近的操作。

我想计算一个元素的“已保存”事件的数量。这需要是对每个元素“保存”的最近历史事件的计数。是否有一个 SQL 查询可以很好地做到这一点?我有2个我想浓缩。

表列:time(时间戳)、user_id(int)、file_name(字符串)、action_type(字符串)

user_id+file_name组合决定了我关心的“元素”,但这个组合在表中并不是唯一的

我想要什么:获取最近将其“保存”为操作的所有用户的文件“index.html”的计数

4

2 回答 2

1

你可以使用类似下面的东西。它首先过滤掉 index.html 的所有 SAVED 记录。然后,它丢弃任何存在同一用户和文件的新记录的记录。

因此,如果用户 1 在 09:00 和 12:00 保存文件,则只有 12:00 的记录会计算在内。

select count(*) from tableName t
where t.action_type = 'SAVED'
and t.filename = 'index.html'
and not exists 
   (select * from tableName t2
    where t2.user_id = t.user_id and t2.filename = t.filename
    and t2.time > t.time
    and t2.action_type = 'SAVED')

如果您想要它以使更新的删除记录停止计算保存,请删除该and t2.action_type = 'SAVED'

这样,如果 user1 在 09:00 保存文件并在 11:00 将其删除,则任何记录都不会计算在内。删除的记录不包含在结果中(因为t.action_type = 'SAVED'),但它比 09:00 记录更新,因此停止显示。

于 2013-04-03T12:17:28.623 回答
0

由于“最近”没有正确的定义,查询可以是:

select count(*) from tlbName where filename='index.html' and action='saved'

如果有时间,那么:

select count(*) from tlbName where filename='index.html' and action='saved' and timestamp between 'timeval_1' and 'timeval_2'

希望它有帮助。

于 2013-04-03T05:23:31.880 回答