sql实现如果是工作日,那就取工作日的保有,非工作日则取上一个工作日的保有,已经有日期维度表,里面包含工作日标记,和上一个工作日字段
时间: 2024-03-19 21:43:15 浏览: 203
可以使用SQL中的CASE WHEN语句来实现该需求。具体实现如下:
```sql
SELECT
t1.date,
CASE
-- 如果当天是工作日,则直接取该天的保有
WHEN t1.is_workday = 1 THEN t1.holding
-- 如果当天不是工作日,则取上一个工作日的保有
ELSE (
SELECT t2.holding
FROM date_dimension t2
WHERE t2.is_workday = 1
AND t2.date < t1.date
ORDER BY t2.date DESC
LIMIT 1
)
END AS holding
FROM date_dimension t1
```
其中,`date_dimension`是日期维度表,包含日期、工作日标记和上一个工作日字段。`is_workday`字段为1表示当天是工作日,为0表示不是工作日。上一个工作日字段可以根据实际情况进行计算得出。
以上SQL语句会根据日期维度表中的工作日标记和上一个工作日字段来判断当天是否为工作日,如果是工作日则直接取当天的保有,否则就找到上一个工作日并取其保有。
相关问题
sql实现如果是工作日,那就取基金产品工作日的保有,非工作日则取上一个工作日的保有,已经有日期维度表,里面包含工作日标记,和上一个工作日字段
可以使用SQL中的CASE语句来实现。具体的实现方式如下:
```
SELECT
fund_product,
CASE
WHEN is_workday = 1 THEN holding
ELSE (
SELECT holding
FROM date_dimension
WHERE date =
(SELECT MAX(date)
FROM date_dimension
WHERE date < t.date AND is_workday = 1)
)
END AS holding
FROM
date_dimension t
```
其中,fund_product是基金产品名称,is_workday为日期维度表中的工作日标记(1代表工作日,0代表非工作日),holding为基金产品在该日期的保有量。在SQL中,CASE语句可以用来根据不同条件执行不同的逻辑。这里,我们使用CASE语句来判断日期是否为工作日,如果是工作日,则直接取对应的保有量;如果不是工作日,则使用子查询来获取上一个工作日的保有量。其中,子查询会查找日期维度表中小于当前日期的最近一个工作日,并返回该工作日的保有量。
fact 表有保有,基金名称,日期,date表有日期,工作日标志,sql实现如果是工作日,那就取基金产品工作日的保有,非工作日则取上一个工作日各基金的保有,
可以使用SQL中的CASE语句和子查询来实现。具体的实现方式如下:
```
SELECT
fact.fund_name,
fact.date,
CASE
WHEN date.is_workday = 1 THEN fact.holding
ELSE (
SELECT holding
FROM fact AS f
INNER JOIN date_dimension AS d ON f.date = d.date
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
fact
INNER JOIN date_dimension ON fact.date = date_dimension.date
```
其中,fact表中包含基金产品名称、日期和保有量信息,date_dimension表中包含日期和工作日标志信息。在SQL中,我们使用CASE语句来判断日期是否为工作日,如果是工作日,则直接取对应的保有量;如果不是工作日,则使用子查询来获取该基金在上一个工作日的保有量。子查询中,我们首先使用INNER JOIN将fact表和date_dimension表连接起来,然后根据基金名称和日期限制条件筛选出符合要求的数据,最后按照日期倒序排序并取第一条数据,即可得到上一个工作日的保有量。
阅读全文