2011-02-08 104 views
2

与表设置具有以下字段:选择每个索引值的一个行,最大列值

SKU, EVENTSTARTDATE, EVENTENDDATE, PRICE, (...etc...) 

和壳体数千行这里是示例数据(日期YYMMDD,世纪代码除外):

 
1111111, 101224, 1, 10.99 
1111111, 110208, 110220, 9.99 
1111111, 110301, 110331, 8.99 
2222222, 101112, 101128, 15.99 
2222222, 101201, 110102, 14.99 
etc 

我想有一个SELECT语句每个SKU返回一行,最大EVENTSTARTDATE没有WHERE子句隔离特定的SKU或不完整的SKU子集(所需的SELECT语句应该为每个SKU返回一行用于所有SKU )。我最终希望添加开始日期小于或等于当前日期的标准,并且结束日期大于或等于当前日期,但我必须先从某处开始。

所需的(现在只最大号)示例结果:

 
1111111, 110301, 110331, 8.99 
2222222, 101201, 110102, 14.99 
etc. 
+0

所以这是一个驱动起来,写我的-SQL换我的窗口? Otoh,你是如何问一个查询问题的...... – 2011-02-08 19:37:06

+1

它是一个动力,因为我不知道该怎么做,而是问如何在SELECT中做到这一点。但最终实现将最终需要跨多个表的连接,日期范围标准以及其他我必须自行实施的事情。这是一个起点。我需要知道如何做到这一点,而不是专门为我的确切数据编写代码,但是我发现很难在不提供示例数据的情况下准确找到我正在查找的内容。 – VL20 2011-02-08 19:57:00

回答

2

最近版本的DB2,您可以使用分析功能ROW_NUMBER()

SELECT * 
FROM (
    SELECT 
     tablename.*, 
     ROW_NUMBER() OVER (PARTITION BY sku 
          ORDER BY eventstartdate DESC) As RowNum 
     FROM tablename) X 
WHERE X.RowNum=1 

为每个分区(SKU组),该数据是行编号在order by eventstartdate desc之后,所以1,2,3,...从1开始,为最新的EventStartDate。 WHERE子句然后仅拾取每个SKU的最新版本。

1

看一看GROUP BY和HAVING子句。

select sku, max(eventstartdate) 
FROM TABLE 
group by sku 
having eventstartdate <= sysdate 

编辑:添加具有声明

+0

它有一个问题,在select语句中不容易捕捉到其他的敌人。不要忘记把FROM放在最后一个查询中。 – pcofre 2011-02-08 19:18:07

0

其他的解决办法

select distinct f3.* 
from yourtable f1 
inner join lateral 
     (
     select * from yourtable f2 
     where f1.SKU=f2.SKU 
     order by EVENTSTARTDATE desc, EVENTENDDATE desc 
     fetch first rows only 
     ) f3 on 1=1