我的查询看起来像这样:
var pf = null;
pf += Test.Print1;
pf += t.Print;
查询按其ID返回实体列表。 喜欢(它并不重要):
除此之外,我还有包含3列的表:12001
12004
15003
序列 实体(来自上方) value_date(格式:dd / mm / yyyy) 所有实体的价值日期都不相同。
例如,表格如下:
with t as (
****** complex query from several joining tables *****
)
select * from t;
我需要为每个实体运行(来自查询,因为该表还为我保留了不相关的实体),并为实体选择max value_date的最大序列。 (换句话说,为每个实体找到max value_date,并在其中找到max seq)。
结果需要列出3列:seq,entity,value_date。 我该怎么办?
我希望我的问题很明确。
答案 0 :(得分:1)
嗯。这是一种不需要聚合的方法:
with t as (
****** complex query from several joining tables *****
)
select t.*,
(select max(t2.seq) keep (dense_rank first order by date desc)
from t2
where t2.entity = t.entity
) as max_seq
from t;
如果您还需要日期,则可以更轻松地获取日期:
select t.*,
(select max(t2.seq) keep (dense_rank first order by t2.date desc)
from t2
where t2.entity = t.entity
) as max_seq,
(select max(t2.date)
from t2
where t2.entity = t.entity
) as max_date
from t;
答案 1 :(得分:1)
您可能最好使用视图并加入此视图,尤其是如果您需要此逻辑(选择最高日期,每个实体的最高seq)不止一次。
create view (...viewname...)
- SELECT部分如下:
select seq, entity, value_date
from (
select seq, entity, value_date,
row_number() over
(partition by entity order by value_date desc, seq desc) as rn
from t2
)
where rn = 1;
然后:
with t as ( ... )
select t.*, v.seq, v.value_date
from t inner join viewname v
on t.entity = v.entity
通过重新阅读您的帖子,您真正需要的只是视图定义的select
部分 - 以您需要的任何方式使用它。
当你说value_date格式为dd / mm / yyyy时,我不确定 - 这似乎意味着它是VARCHAR2或其他类似的字符串格式,而不是实际日期。在这种情况下,最好的选择是修复数据结构并使其成为日期数据类型。否则,您需要使用to_date(value_date, 'dd/mm/yyyy')
而不是value_date
。