我希望将以下以 ETL 编写的查询转换为 Oracle sql。请帮忙。
WITH b1 AS (
SELECT b.fap_inr_idr, b.lod_tmp FROM to_cnf_pye_bse b GROUP BY b.fap_inr_idr, b.lod_tmp
), b2 AS (
SELECT TO_DATE(DATE_SUB(TO_DATE(lod_tmp), DAY(TO_DATE(lod_tmp)) - 1)) AS req_month, b1.* FROM b1
)
SELECT req_month, count(*) AS volume
FROM b2
WHERE req_month < '2021-01-01'
GROUP BY req_month
ORDER BY req_month;
答案 0 :(得分:0)
您的日期计算公式“日期 -(月中的天数 - 1)”的结果是当月的第一天。因此,您的示例日期 03/04/1993 将导致日期 03/01/1993(假设日期格式为 mm/dd/yyyy)。整个查询然后获取前几个月的行数。因此假设您的列 lod_tmp 是 SqlServer 默认日期格式 'yyyy-mm-dd' 中的字符串,那么您的公式:
SELECT TO_DATE(DATE_SUB(TO_DATE(lod_tmp), DAY(TO_DATE(lod_tmp)) - 1)) AS req_month
翻译为 Oracle
select trunc( to_date(lod_tmp, 'yyyy-mm-dd'), 'mm') req_month.
我不确定在带有聚合函数的 SqlServer 中的 GROUP BY 实际上是做什么的,但在 Oracle 中是消除重复项,我假设 SqlServer 也是如此。如果是这样,请尝试:
alter session set nls_date_format = 'yyyy-mm-dd';
with b1 as
( select b.fap_inr_idr, b.lod_tmp
from to_cnf_pye_bse b
group by b.fap_inr_idr, b.lod_tmp
)
select trunc(to_date(lod_tmp), 'mm') req_month, count(*)
from b1
where trunc( to_date(lod_tmp, 'mm') < date '2021-01-01'
group by trunc( to_date(lod_tmp, 'mm')
order by 1;
If you do not want or cannot set nls_data_format then use trunc(to_date(lod_tmp,'yyyy-mm-dd'), 'mm') ;