有一张表dw.fact_product_capital 里面包含字段日期sk_date,基金名称jjmc,规模capital,户数zhs,有一张日期表包含日期字段sk_date,工作日标志workd_flag(不包含周六周日以及法定节假日),用sql实现目标,如果是工作日,就取当天的保有,如果为非工作日,就取上一个工作日的保有替换
时间: 2024-03-22 17:36:52 浏览: 21
可以使用SQL窗口函数中的LAG函数来实现这个需求,具体语法如下:
```
SELECT
sk_date,
jjmc,
CASE WHEN workd_flag = 1 THEN capital ELSE LAG(capital, 1) OVER (PARTITION BY jjmc ORDER BY sk_date) END AS capital
FROM
dw.fact_product_capital
JOIN 日期表 ON dw.fact_product_capital.sk_date = 日期表.sk_date
```
其中,LAG函数用于获取同一基金名称下上一个工作日的保有,如果当天是工作日,则直接取当天的保有。使用了窗口函数,根据基金名称进行分组,按照日期排序。如果上一个工作日的保有不存在,则LAG函数返回NULL,此时需要根据实际情况进行处理。
相关问题
SELECT fact_product_capital.JJMC, CASE WHEN dim_date.workday_flag = 1 THEN fact_product_capital.capital ELSE LAG(fact_product_capital.capital, 1, 0) OVER (PARTITION BY fact_product_capital.JJMC ORDER BY dim_date.sk_date) END AS hold_capital FROM fact_product_capital JOIN dim_date ON fact_product_capital.sk_date = dim_date.sk_date WHERE dim_date.sk_date >= '2021-01-01'存在数据不准确
非常抱歉,您遇到的问题可能是由于SQL语句中LAG函数的使用不当导致的。LAG函数的第三个参数是用来指定默认值的,如果没有指定,默认值为NULL。在您提供的SQL语句中,当非工作日没有前一天的保有资本时,LAG函数会返回NULL,导致数据不准确。为了解决这个问题,可以将LAG函数的第三个参数设置为0,表示当没有前一天的保有资本时,将保有资本设为0。修改后的SQL语句如下所示:
```
SELECT fact_product_capital.JJMC,
CASE WHEN dim_date.workday_flag = 1 THEN fact_product_capital.capital
ELSE LAG(fact_product_capital.capital, 1, 0) OVER (PARTITION BY fact_product_capital.JJMC ORDER BY dim_date.sk_date)
END AS hold_capital
FROM fact_product_capital
JOIN dim_date ON fact_product_capital.sk_date = dim_date.sk_date
WHERE dim_date.sk_date >= '2021-01-01'
```
希望这个修改后的SQL语句能够解决您的问题。如果还有其他问题,请随时提出。
如果是工作日,取各基金工作日的保有capital,非工作日取上面最近的工作日的保有,已经有fact_product_capital表包含字段基金名称JJMC,保有capital,日期sk_date ,日期维度表dim_date 包含字段:日期sk_date,工作日标记workday_flag
可以使用 SQL 语句来实现这个需求。具体的实现步骤如下:
1. 首先,需要将日期维度表和基金保有量表按照日期进行关联,得到每个基金在每个日期的保有量。关联条件为:日期维度表的日期和基金保有量表的日期相等,并且基金名称相等。
```sql
SELECT
dim_date.sk_date,
fact_product_capital.JJMC,
fact_product_capital.capital
FROM
dim_date
JOIN fact_product_capital ON dim_date.sk_date = fact_product_capital.sk_date AND dim_date.workday_flag = 1
```
2. 接着,使用窗口函数和 COALESCE 函数计算出每个非工作日的最近一个工作日,然后再将这个日期和基金名称关联起来,得到最终的结果。
```sql
SELECT
dim_date.sk_date,
fact_product_capital.JJMC,
COALESCE(fact_product_capital.capital, last_capital.capital) AS capital
FROM
dim_date
JOIN fact_product_capital ON dim_date.sk_date = fact_product_capital.sk_date AND dim_date.workday_flag = 1
LEFT JOIN (
SELECT
JJMC,
sk_date,
capital,
ROW_NUMBER() OVER (PARTITION BY JJMC ORDER BY sk_date DESC) AS rn
FROM
fact_product_capital
WHERE
sk_date < '2021-01-01' AND JJMC = '基金名称'
) last_capital ON dim_date.sk_date = last_capital.sk_date AND fact_product_capital.JJMC = last_capital.JJMC AND last_capital.rn = 1
WHERE
dim_date.sk_date >= '2021-01-01'
```
上述 SQL 语句中,`fact_product_capital` 表是基金保有量表,`dim_date` 表是日期维度表,`JJMC` 是基金名称,`capital` 是保有量,`sk_date` 是日期,`workday_flag` 是工作日标记。需要根据具体的数据结构和业务逻辑来调整 SQL 语句中的表名、字段名和条件。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)