sql查询以获取给定列集的最新数据

时间:2013-04-03 05:13:09

标签: sql postgresql

我有一个postgres表,表示我表中“元素”的历史记录。元素由2列

组成

历史数据的行为类似于“已保存”或“已删除”,可能会对任何元素多次发生。这些是相互排斥的,因此当我查看当前状态时,请关注最近的操作。

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

表格列:     时间(时间戳),     user_id(int),     file_name(string),     action_type(string)

user_id + file_name组合确定了我关心的'元素',但此组合在表格中并不唯一

我想要的是:为最近“保存”它作为行动的所有用户获取“index.html”文件的计数

2 个答案:

答案 0 :(得分:1)

您可以使用以下内容。它首先过滤掉index.html的所有SAVED记录。然后它会丢弃那些存在同一用户和文件的新记录的记录。

因此,如果user1在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记录更新,所以停止显示。

答案 1 :(得分: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'

希望它有所帮助。