sql实现,有一张表fact包含了以下字段,基金名称,日期,规模,户数,需要实现,需要讲它变成,如果规模的日期是工作日,则取它本身,如果为非工作日,则取上一个工作日的规模,有一张日期维度表可以用,包含工作日标记,和日期dage
时间: 2024-03-20 19:41:45 浏览: 120
可以使用 SQL 的日期函数和子查询来实现该需求。以下是一个简单的示例 SQL 语句:
```
SELECT
f.基金名称,
f.日期,
CASE WHEN d.工作日标记 = 1 THEN f.规模 ELSE (
SELECT f2.规模
FROM fact f2
JOIN date_dimension d2 ON f2.日期 = d2.日期
WHERE f2.基金名称 = f.基金名称
AND d2.工作日标记 = 1
AND d2.日期 < d.日期
ORDER BY d2.日期 DESC
LIMIT 1
) END AS 规模,
f.户数
FROM fact f
JOIN date_dimension d ON f.日期 = d.日期;
```
其中,`fact` 表是原始数据表,包含基金名称、日期、规模和户数等字段;`date_dimension` 表是日期维度表,包含日期和工作日标记等字段。
在 SQL 语句中,使用 `CASE WHEN` 子句来判断日期是否是工作日,如果是工作日则直接取规模本身,否则使用一个子查询来查找上一个工作日的规模,具体实现方式是:
1. 在子查询中,使用 `JOIN` 子句连接 `fact` 表和 `date_dimension` 表,按照日期倒序排序,找到最近的一个工作日的规模。
2. 在子查询中,使用 `WHERE` 子句过滤出基金名称相同且日期小于当前日期且是工作日的记录。
3. 在子查询中,使用 `LIMIT` 子句限制只返回一条记录,即上一个工作日的规模。
希望这个 SQL 语句能够对您有所帮助!
阅读全文