可以使用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表连接起来,然后根据基金名称和日期限制条件筛选出符合要求的数据,最后按照日期倒序排序并取第一条数据,即可得到上一个工作日的保有量。不支持select端子查询
时间: 2024-02-14 13:14:50 浏览: 76
子查询是指一条SELECT语句作为另一条SELECT语句的一部分,外层的SELCT语句称为外部查询,内层的SELECT语句称为内部查询(或子查询)
如果不能使用SELECT端子查询,可以使用LEFT JOIN和GROUP BY来实现,具体的实现方式如下:
```
SELECT
fact.fund_name,
fact.date,
CASE
WHEN date.is_workday = 1 THEN fact.holding
ELSE MAX(fact_prev.holding)
END AS holding
FROM
fact
INNER JOIN date_dimension ON fact.date = date_dimension.date
LEFT JOIN fact AS fact_prev ON fact.fund_name = fact_prev.fund_name
AND fact_prev.date < fact.date
AND date_dimension.is_workday = 0
AND fact_prev.date = (
SELECT MAX(date)
FROM date_dimension
WHERE is_workday = 1 AND date < fact.date
)
GROUP BY
fact.fund_name,
fact.date,
date_dimension.is_workday,
fact.holding
```
其中,我们使用LEFT JOIN将fact表与自身连接起来,以获取上一个工作日的保有量。在LEFT JOIN中,我们限制fact_prev表的日期小于当前日期,且对应的工作日标志为0(即非工作日)。同时,我们使用子查询来获取上一个工作日的日期,并将其作为连接条件之一。最后,我们使用GROUP BY来对基金名称、日期、工作日标志和保有量进行分组,以确保每条记录的唯一性。
阅读全文