2015-04-22 34 views
1

我正在使用HP Vertica來編寫我的查詢。我想要選擇一些數據,當你使用函數範圍標誌啓用 [VLOOKUP(A1; B1:C4; 2; )]時,Excel應該會這樣做。如何加入表格以獲取類似於Excel VLOOKUP-Range-Function的值?

我給你一個簡單的例子,以便更好地理解。我有一個表格顯示歷史倉庫的動向。

stock_history 
------------- 

|product|location|time_stamp | 
|-------|--------|------------| 
| A  | Loc A | 2015-01-13 | 
| A  | Loc B | 2015-03-13 | 
  • 產品A位置被移動的
  • (和在那裏呆了月)
  • B位置3月移動

現在我希望看到的位置在個月(假設只有一個每月允許的運動,使其更容易)

它應該是這樣的

|product|location|month | 
|-------|--------|----- ---| 
| A  | Loc A | 2015-01 | 
| A  | Loc A | 2015-02 | 
| A  | Loc B | 2015-03 | 

我已經生成的表給出了所有月份:

all_months 
---------- 

|month | 
|---------| 
| 2015-01 | 
| 2015-02 | 
| 2015-03 | 

這裏是我試過

聲明
select his.product 
    , his.location 
    , mon.month 

from stock_history as his 

left outer join all_months as mon 
on mon.month = to_char(time_stamp, 'YYYY-MM') 

|product |location|month | 
|--------|--------|----- ---| 
| A  | Loc A | 2015-01 | 
| (null) | (null) | 2015-02 | 
| A  | Loc B | 2015-03 | 

我如何管理它,以便在2月份獲得產品A,因爲它仍然在2月的位置A?

感謝您閱讀我的問題。我期待着得到你的答案;)

問候, 菲利克斯

+0

你是在做這一個產品或所有產品? –

+0

我正在爲所有產品做這件事。 – Phoen

回答

0

在這裏,你去! 我還添加了添加月份的示例。使用遞歸功能。 我用oracle測試過,也應該用vertica工作。

CREATE TABLE A 
(PRODUCT CHAR(1),LOCATION VARCHAR(10),MONTHS VARCHAR(10)) 

INSERT INTO A (PRODUCT,LOCATION,MONTHS) 
SELECT 'A','LOC A','2015-01' FROM DUAL 
UNION 
SELECT 'A','LOC B','2015-03' FROM DUAL 

CREATE TABLE MONTHS 
(MON VARCHAR(10)) 

INSERT INTO MONTHS(MON) 
SELECT '2015-01' FROM DUAL 
UNION 
SELECT '2015-02' FROM DUAL 
UNION 
SELECT '2015-03' FROM DUAL 
UNION 
SELECT '2015-04' FROM DUAL 
UNION 
SELECT '2015-05' FROM DUAL 
UNION 
SELECT '2015-06' FROM DUAL 
COMMIT 

WITH CTE (I,PRODUCT,LOCATION,MON) AS 
(
SELECT 1 I,BASE.PRODUCT,A.LOCATION,M.MON 
FROM 
(SELECT DISTINCT PRODUCT FROM A)BASE 
CROSS JOIN 
MONTHS M 
LEFT JOIN A 
ON A.MONTHS=M.MON 
UNION ALL 
SELECT I+1,PRODUCT,COALESCE(LOCATION,LAG(LOCATION)OVER(PARTITION BY PRODUCT ORDER BY MON)) AS LOC,MON 
FROM 
CTE WHERE I<12 
) 
SELECT DISTINCT PRODUCT,LOCATION,MON FROM CTE WHERE LOCATION IS NOT NULL 
ORDER BY MON 
0

您可以生成使用cross join所有的月/產品組合。然後使用相關子查詢從最近或當前月份獲取位置:

select mon.month, p.product, 
     (select sh.location 
     from stock_history sh 
     where mon.month <= to_char(sh.time_stamp, 'YYYY-MM') and p.product = sh.product 
     order by mon.month desc 
     limit 1 
     ) as location 
from (select distinct product p from stock_history) p cross join 
    all_months mon; 
相關問題