如何在SQL中编写拆分语句,如果开始和结束日期的月份不同,则会将记录划分为2条记录?
我有以下SQL代码,如果'COV_PRD_STRT_DT'和'COV_PRD_END_DT'是不同的月份,我需要将行分成两行。如何在SQL中编写拆分语句,如果开始和结束日期的月份不同,则会将记录划分为2条记录?
WITH CTE AS
(SELECT COV_PRD_STRT_DT,TO_DATE,COV_PRD_END_DT as MO_END_DT,
case when dateadd (DAY,-DAY(DATEADD(MONTH,1, BF.COV_PRD_STRT_DT)),
DATEADD(MONTH,1, d.from_date))
< To_date THEN DATEADD(DAY,-DAY(DATEADD(MONTH,1, BF.COV_PRD_END_DT)),
DATEADD(MONTH,1, BF.COV_PRD_END_DT))
ELSE To_Date END as MO_END_DT
FROM BILLING_FACT
UNION ALL
SELECT COV_PRD_STRT_DT,To_date,DATEADD(DAY,1,BF.COV_PRD_END_DT) as MO_END_DT, < TO_DATE
THEN DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1,BF.COV_PRD_END_DT)))
ELSE To_Date END as MO_END_DT
FROM CTE WHERE COV_PRD_END_DT < To_Date
)
select * from CTE order by COV_PRD_STRT_DT,COV_PRD_END_DT
感谢
如果开始日期和结束日期是不是在一个月的水平相等,用cov_prd_strt_dt开始日期,并得到其月结束日期为结束日期,并有cov_prd_end_dt月份开始日期为其他行的开始日期和cov_prd_end_dt结束日期分割的日期
SELECT cov_prd_strt_dt strt_dt,
CASE WHEN DATE_PART('Month', cov_prd_strt_dt) <> DATE_PART('Month', cov_prd_end_dt)
THEN LAST_DAY(cov_prd_strt_dt)
ELSE cov_prd_end_dt
END end_dt
FROM billing_fact
UNION
SELECT CASE WHEN DATE_PART('Month', cov_prd_strt_dt) <> DATE_PART('Month', cov_prd_end_dt)
THEN DATE_TRUNC(cov_prd_end_dt)
ELSE cov_prd_strt_dt
END strt_dt,
cov_prd_end_dt end_dt,
FROM billing_fact
使用UNION只将消除那些不为分裂(同一个月cov_prd_strt_dt和cov_prd_end_dt)处理重复的记录。
上面查询不工作抛出错误^找到“FROM”(在字符387)期待标识符找到关键字 – user8611702
我正在Netezza数据库上工作。 Netezza不支持DATE_TRUNC逻辑我猜 – user8611702
对不起,在FROM之前的第二个查询中有一个额外的逗号 –
一个或两个结果行的好答案。一般情况下,加入会在性能/关系思维以及代码可读性方面做得更好,(我知道最后一点可以是意见的问题,但绝不会重要)
首先我创建与所有相关个月临时表(但我想你应该有一个类似的表自己的话):
Create temp table months as
Select distinct substr(cov_prd_strt_dt,1,7) yyyy_mm
Union
Select distinct substr(cov_prd_end_dt,1,7) yyyy_mm
然后到实际的加盟:
Select
*,
substr(cov_prd_start_dt,1,7) start_yyyy_mm,
substr(cov_prd_end_dt,1,7) end_yyyy_mm
From billing_fact f
Join months m
On m.yyyy_mm between f.start_yyyy_mm and f.end_yyyy_mm
我希望这有助于
可以显示一些示例数据和预期结果吗? –
@FerdinandGaspar - 嗨,不幸的是,我不能提供样本数据,因为它的PHI – user8611702
可以是一些组成样本,但具有相同的数据类型 –