使用包含以下字段的表格设置:
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.
答案 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