Sql 如何联接表以获得类似于Excel VLOOKUP范围函数的值?

Sql 如何联接表以获得类似于Excel VLOOKUP范围函数的值?,sql,vertica,Sql,Vertica,我正在使用HP Vertica编写查询。我想选择一些数据,当您在启用范围标志的情况下使用VLOOKUP函数[VLOOKUPA1;B1:C4;2;1]时,Excel会这样做 我给你们举一个简单的例子,以便更好地理解。我有一张显示历史仓库移动的表格 stock_history ------------- |product|location|time_stamp | |-------|--------|------------| | A | Loc A | 2015-01-13 | |

我正在使用HP Vertica编写查询。我想选择一些数据,当您在启用范围标志的情况下使用VLOOKUP函数[VLOOKUPA1;B1:C4;2;1]时,Excel会这样做

我给你们举一个简单的例子,以便更好地理解。我有一张显示历史仓库移动的表格

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

|product|location|time_stamp  |
|-------|--------|------------|
| A     | Loc A  | 2015-01-13 |
| A     | Loc B  | 2015-03-13 |
产品A于1月份被转移到位置A 二月份就呆在那里了 并于3月被转移到B区 现在我想每月查看一次at的位置,假设每月只允许一次移动,以使其更容易

应该是这样的

|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 |
我如何管理它以使产品A也在2月份的生产线上,因为它在2月份仍然在位置A

谢谢你阅读我的问题。我期待着得到你的答案

问候,,
Felix

您可以使用交叉联接生成所有月份/产品组合。然后使用相关子查询从最近或当前月份获取位置:

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;
给你! 我还添加了几个月的示例。使用了递归特性。 我用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

你这样做是为了一种产品还是所有产品?我这样做是为了所有产品。