使用最大列值为每个索引值选择一行

时间:2011-02-08 18:51:31

标签: sql database db2 greatest-n-per-group ibm-midrange

使用包含以下字段的表格设置:

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

这里有数千行是示例数据(日期是YYMMDD,不包括世纪代码):

1111111, 101224, 101231, 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.

3 个答案:

答案 0 :(得分: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,...从最近的EventStartDate的1开始。然后,WHERE子句仅选取最新的每个SKU。

答案 1 :(得分:1)

查看GROUP BY和HAVING子句。

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

编辑:添加了HAVING语句

答案 2 :(得分: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