目前尚不清楚这两种说法是否存在冲突。我认为它们存在冲突,我将在下面的代码中使用语句 1。
[1.] 我需要的是给定年份,选择具有不同 ID1+ID2+Name 列和最大(最近)有效日期(以 YYYYMMDD 格式,存储为整数)的记录,上述年份介于 YearFrom 之间和 YearTo 范围。
[2.] 在这种情况下,项目 1 将不会被退回,因为项目 1 的最新记录的范围是 2009-2013。
我会说第 1 项不会被退回,因为它没有 2008 年的信息。如果它确实有 2008 年的信息,则无论是否碰巧有更新的数据,都应该按照上面的语句 1 返回。
如果你扩展你的表格,让每一年单独出现在一行中,而不是像 2002-2005 这样的范围内暗示,这非常简单。下面的查询在 PostgreSQL 中;您应该只需将第一个公用表表达式替换为等效的 DB2 表达式即可生成数字表(或使用实际的数字表),并修正 CTE 语法。(DB2 的 CTE 语法是独一无二的。)
with years as (
select generate_series(2000, 2020) as year
),
expanded_table1 as (
select id1, id2, name, year, yearfrom, yearto, effdate
from Table1
inner join years on years.year between YearFrom and YearTo
)
select id1, id2, name, year, max(effdate)
from expanded_table1
where year = 2008
group by id1, id2, name, year
解释
此查询(第一个 CTE)生成一系列整数,表示我们可能感兴趣的所有年份。更强大的解决方案可能会从您的表中为数字生成器选择最小和最大年份,而不是使用整数文字。
select generate_series(2000, 2020) as year;
YEAR
--
2000
2001
2002
...
2020
通过将该表与您的表连接起来,我们可以将范围扩展为行。
with years as (
select generate_series(2000, 2020) as year
)
select id1, id2, name, year, yearfrom, yearto, effdate
from Table1
inner join years on years.year between YearFrom and YearTo
order by id1, id2, name, year;
ID1 ID2 NAME YEAR YEARFROM YEARTO EFFDATE
--
AB 10 item1 2002 2002 2005 20091201
AB 10 item1 2003 2002 2005 20091201
AB 10 item1 2004 2002 2005 20091201
AB 10 item1 2005 2002 2005 20091201
...
以这种方式准备好基础后,为给定年份的 id1、id2、name 的每个不同组合查找最大有效日期的查询只是一个带有 WHERE 子句的简单 GROUP BY。
with years as (
select generate_series(2000, 2020) as year
),
expanded_table1 as (
select id1, id2, name, year, yearfrom, yearto, effdate
from Table1
inner join years on years.year between YearFrom and YearTo
)
select id1, id2, name, year, max(effdate)
from expanded_table1
where year = 2011
group by id1, id2, name, year
ID1 ID2 NAME YEAR MAX
--
AB 10 item1 2011 20100301
XX 20 item2 2011 20090912