我有一个postgres数据库,其中包含用户表(userid,firstname,lastname)和usermetadata表(userid,代码,内容,创建的日期时间).我按代码在usermetadata表中存储有关每个用户的各种信息,并保留完整的历史记录.例如,用户(用户ID 15)具有以下元数据:
15, 'QHS', '20', '2008-08-24 13:36:33.465567-04' 15, 'QHE', '8', '2008-08-24 12:07:08.660519-04' 15, 'QHS', '21', '2008-08-24 09:44:44.39354-04' 15, 'QHE', '10', '2008-08-24 08:47:57.672058-04'
我需要获取所有用户的列表以及各种用户元数据代码的最新值.我以编程方式做到了这一点,当然是神圣的缓慢.在SQL中我能想到的最好的方法是加入子选择,这也很慢,我必须为每个代码做一个.
这在PostgreSQL中实际上并不难,因为它的SELECT语法中有"DISTINCT ON"子句(DISTINCT ON不是标准SQL).
SELECT DISTINCT ON (code) code, content, createtime FROM metatable WHERE userid = 15 ORDER BY code, createtime DESC;
这会将返回的结果限制为每个唯一代码的第一个结果,如果按创建时间降序对结果进行排序,则会获得每个结果的最新结果.