0

这是表结构:

ID
FIELD_A
FIELD_B
DATE_FIELD
VALUE_FIELD

ID 字段只是一个随每条记录递增的数字。我们在一天内获得了 2“组”记录,其中 FIELD_A、FIELD_B、DATE_FIELD 完全相同,但 VALUE_FIELD 可以不同。我们得到一个早上的设置和一个晚上的设置。您可以分辨出哪个是哪个,因为早上记录集的 ID 值较低(因为它们是首先插入的),而晚上记录的 ID 值较高(因为它们是在之后插入的)。

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

4

3 回答 3

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子句定义)。

于 2013-06-20T15:01:15.750 回答
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)
于 2013-06-20T15:41:41.633 回答
0

实际上,有点让我想起了这个问题:)。像这样的东西应该工作:

    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
于 2013-06-20T15:18:35.650 回答