这是表结构:
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)将给出我们至少在当天早上所拥有的。
答案 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