每天oracle sql 2记录每个唯一字段,如何获取最新信息

时间:2013-06-20 14:58:36

标签: sql oracle

这是表结构:

ID
FIELD_A
FIELD_B
DATE_FIELD
VALUE_FIELD

ID字段只是一个随每条记录递增的数字。我们在一天中得到2个“集合”的记录,其中FIELD_A,FIELD_B,DATE_FIELD完全相同但VALUE_FIELD可以不同。我们准备了一个早晨和一个晚上。你可以知道哪个是因为早晨集的那组记录的ID值较低(因为它们是先插入的),而且该集合中的晚间记录(因为它们是在之后插入的)的ID更高。 / p>

问题是,如果我想要查看每个记录的FIELD_A,FIELD_B,DATE_FIELD的最高ID值的视图,我该怎么做?基本上我不关心我的观点中的早晨,只想看到晚上。但是,在当天如果我们仍然在早上,“最高”的ID值将是当时唯一的ID值,因此max(id)将给出我们至少在当天早上所拥有的。

3 个答案:

答案 0 :(得分:5)

您将使用分析函数row_number()

create view vw_afternoon as
    select id, field_a, field_b, date_field, value_field
    from (select t.*,
                 row_number() over (partition by field_a, field_b, date_field
                                    order by id desc
                                   ) as seqnum
          from t
         ) t
    where seqnum = 1;

函数row_number()为组内的行(由partition子句定义)分配顺序值。 id最高的那个获得值1,然后是其余的(由order by子句定义)。

答案 1 :(得分:1)

如果有人需要一个在不支持partition_by的SQL环境中有效的答案,我想你也可以使用:

create view my_view as SELECT * FROM my_table WHERE id IN
   (SELECT max(id) FROM my_table GROUP BY field_a, field_b, date_field)

答案 2 :(得分:0)

实际上,有点让我想起了this问题:)。这样的事情应该有效:

    CREATE VIEW afternoon AS
    SELECT t1.* FROM table t1 INNER JOIN table t2 
    ON t1.field_a = t2.field_a AND t1.field_b = t2.field_b 
    AND t1.date_field = t2.date_field AND t1.id > t2.id