如果是工作日,取各基金工作日的保有capital,非工作日取上一个工作日的保有,已经有fact_product_capital表包含字段基金名称JJMC,保有capital,日期sk_date ,日期维度表dim_date 包含字段:日期sk_date,工作日标记workday_flag
时间: 2024-03-19 14:46:14 浏览: 23
好的,根据您的描述,您可以使用以下SQL语句来获取您想要的结果:
```
SELECT fpc.JJMC,
COALESCE(fpc.capital, prev_fpc.capital) AS capital,
d.sk_date
FROM dim_date d
LEFT JOIN fact_product_capital fpc ON d.sk_date = fpc.sk_date AND fpc.workday_flag = 1
LEFT JOIN fact_product_capital prev_fpc ON d.prev_workday_sk_date = prev_fpc.sk_date AND prev_fpc.JJMC = fpc.JJMC
WHERE d.sk_date BETWEEN '开始日期' AND '结束日期'
```
该查询使用了LEFT JOIN连接dim_date和fact_product_capital表,通过sk_date字段进行连接。当fact_product_capital表中相应的sk_date字段不存在时,使用COALESCE函数将capital字段设置为上一个工作日的保有capital,这是通过LEFT JOIN连接fact_product_capital表和prev_fpc表来实现的。最后,使用WHERE子句来限制日期范围。
注意,您需要将“开始日期”和“结束日期”替换为您需要的实际日期。同时,您还需要根据实际情况调整表和字段名称。
相关问题
dw.fact_product_capital表有保有,基金名称,日期,dim_date表有日期,工作日标志,sql实现如果是工作日,那就取基金产品工作日的保有,非工作日则取上一个工作日各基金的保有
可以使用SQL中的CASE语句和子查询来实现。具体的实现方式如下:
```
SELECT
fact.fund_name,
fact.date,
CASE
WHEN date.is_workday = 1 THEN fact.holding
ELSE (
SELECT holding
FROM dw.fact_product_capital AS f
INNER JOIN dim_date AS d ON f.date_key = d.date_key
WHERE f.fund_name = fact.fund_name
AND d.is_workday = 1
AND d.date < fact.date
ORDER BY d.date DESC
LIMIT 1
)
END AS holding
FROM
dw.fact_product_capital AS fact
INNER JOIN dim_date ON fact.date_key = dim_date.date_key
```
其中,dw.fact_product_capital表中包含基金产品名称、日期和保有量信息,dim_date表中包含日期和工作日标志信息。在SQL中,我们使用CASE语句来判断日期是否为工作日,如果是工作日,则直接取对应的保有量;如果不是工作日,则使用子查询来获取该基金在上一个工作日的保有量。子查询中,我们首先使用INNER JOIN将dw.fact_product_capital表和dim_date表连接起来,然后根据基金名称和日期限制条件筛选出符合要求的数据,最后按照日期倒序排序并取第一条数据,即可得到上一个工作日的保有量。
不是,周末的capital为空,需要将休息日的保有取到上一个工作日的保有
非常抱歉,我理解错误了您的问题。那么您需要根据工作日标记以及日期计算每个基金在每个日期的保有capital,如果是休息日,则需要取上一个工作日的保有capital,是吗?
那么可以按照以下步骤进行计算:
1. 使用 LEFT JOIN 将 fact_product_capital 表与 dim_date 表关联,连接条件为 sk_date 字段。
2. 使用 CASE WHEN 函数,对 workday_flag 字段进行判断,如果是工作日,则使用本身的保有capital,否则使用上一个工作日的保有capital。为了实现这个功能,可以使用子查询实现。
3. 使用 GROUP BY 函数,按照基金名称 jjmc 和日期 sk_date 进行分组,对保有capital进行求和。
具体的SQL语句如下所示:
```
SELECT
f.jjmc,
d.sk_date AS date,
SUM(
CASE WHEN d.workday_flag = 1 THEN f.capital ELSE (
SELECT capital
FROM fact_product_capital
WHERE jjmc = f.jjmc
AND sk_date < d.sk_date
AND workday_flag = 1
ORDER BY sk_date DESC
LIMIT 1
) END
) AS holding_capital
FROM
fact_product_capital f
LEFT JOIN dim_date d ON f.sk_date = d.sk_date
GROUP BY
f.jjmc,
d.sk_date
```
这样就可以得到每个基金在每个日期的保有capital了。