SQL View从非标准化表中返回过滤后的数据

时间:2013-10-01 14:29:26

标签: sql postgresql

我必须从表创建一个视图,该视图必须只包含一组重复项中的最新元素。这是一项简单的任务,但问题是该表未规范化。每条记录由三个字符串列标识:Transponder,Country和System。我无法在数据库结构中引入任何更改。应根据“时间”列返回最新元素。所以有这样的数据:

Transponder | Country | System  | Time
--------------------------------------------
AAA         | BBB     | CCC     | 2012-01-01
AAA         | BBB     | CCC     | 2010-01-01
AAA         | BBB     | CCC     | 2013-01-01
AAA         | BAB     | DDD     | 2011-01-01
AAA         | BAB     | DDD     | 2010-01-01

我希望我的视图只返回两行:

AAA         | BBB     | CCC     | 2013-01-01
AAA         | BAB     | DDD     | 2011-01-01

我怎样才能做到这一点?我使用Postgresql 9.2。

4 个答案:

答案 0 :(得分:2)

select distinct on (transponder, country, system) * from some_table
order by transponder, country, system, time desc

答案 1 :(得分:1)

通过转发器,国家,系统从TABLE组中选择转发器,国家,系统最大(时间);

这将为您提供在分组记录中汇总的独特记录(汇总列的转发器,国家,系统(在本例中为时间)。

答案 2 :(得分:0)

Postgre不是我的事,但这看起来就像一个SQL语句问题组:

SELECT transponder, country, system, MAX(time)
  FROM your_table
GROUP BY transponder, country, system
;

答案 3 :(得分:0)

你可以使用......

SELECT  Transporter ,
        Country ,
        [System] ,
        [TIME]
FROM    ( SELECT    Transporter ,
                    Country ,
                    [System] ,
                    [TIME] ,
                    RANK() OVER ( PARTITION BY Transporter, Country, [System] ORDER BY [TIME] DESC ) AS [order]
          FROM      tableName
        ) AS a
WHERE   a.[order] = 1

我需要仔细检查PostgresSQL的语法。