寻找DB2 SQL查询

时间:2013-05-12 10:46:54

标签: sql db2

我对SQL不是很熟悉,我希望这里的一些专家可以向我展示合适而有效的查询,以实现我想要实现的目标。我顺便使用DB2。

以下是示例数据的屏幕截图。我需要的是给定年份,选择具有不同ID1 + ID2 +名称列和最大(最近)生效日期(以YYYYMMDD格式存储为整数)的记录,上述年份在YearFrom和YearTo范围之间。

enter image description here

任何看不到屏幕截图的人:

NAME     YearFrom     YearTo    ID1    ID2    EffDate
item1    2002         2005      AB     10     20091201
item1    2009         2013      AB     10     20100301
item2    2001         2004      XX     20     20050103 
item2    2002         2009      XX     20     20060710 
item2    2007         2013      XX     20     20090912 
item3    2005         2010      YY     30     20110304 

我希望我解释得很清楚。例如,如果用户在2011年查找可用项目,则将返回item1(有效日期20100301)和项目2(有效日期20090912)。

如果有人正在寻找2008年可用的项目:item2(有效日期20090912)和第3项将被退回。在这种情况下,项目1将不予退还,因为项目1的最新记录范围为2009-2013。

认为我的查询的第一部分是正确的,但我不知道如何根据一个查询中的年份从该结果中选择有效记录。

select name,id1,id2,max(effdate) 
from [table] 
group by name,id1,id2

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

你可以使用以下qyery来获得这种类型的输出 -

- 您想检查有效日期是项目name列的最大值的行,那么您只能获取这些记录,然后我们可以将年份条件放在这些记录上。

SELECT NAME, Id1, Id2, Effdate
  FROM Table_Name t_1
 WHERE Effdate =
       (SELECT (t_2.Effdate) 
        FROM Table_Name t_2 
        WHERE t_2.NAME = t_1.NAME
        and t_2.id1 = t_1.id1
        and t_2.id2 = t_1.id2
        GROUP BY t_2.name,t_2.id1,t_2.id2)
   AND Your_Year_Variable_Value BETWEEN t_1.Yearfrom AND t_1.Yearto

答案 1 :(得分:1)

目前尚不清楚这两个陈述是否存在冲突。我认为他们存在冲突,我将在下面的代码中使用声明1。

  

[1.]我需要的是给定年份,选择具有不同ID1 + ID2 +名称列和最大(最近)生效日期(以YYYYMMDD格式存储为整数)的记录,上述年份为在YearFrom和YearTo范围之间。

     

[2。]在这种情况下,项目1不会被退回,因为项目1的最新记录的范围是2009-2013。

我会说项目1不会被退回,因为它没有2008年的信息。如果它 有2008年的信息,那么返回上面的声明1,无论是否有更新的数据。


如果你扩展你的表,所以每年独立出现,而不是像2002-2005这样的范围暗示,这很简单。下面的查询是在PostgreSQL中;您只需要用DB2 equivalent to generate a table of numbers替换第一个公用表表达式(或使用实际的数字表),并修复CTE语法。 (DB2's CTE syntax是唯一的。)

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