2011-02-08 200 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 
相關問題