Sql 如何联接表以获得类似于Excel VLOOKUP范围函数的值?
我正在使用HP Vertica编写查询。我想选择一些数据,当您在启用范围标志的情况下使用VLOOKUP函数[VLOOKUPA1;B1:C4;2;1]时,Excel会这样做 我给你们举一个简单的例子,以便更好地理解。我有一张显示历史仓库移动的表格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 | |
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
你这样做是为了一种产品还是所有产品?我这样做是为了所有产品。