表的自动增量日期字段和oracle sql版本
我有一个表,在这个表中我有一个数据没有正确加载的数据完整性问题,因为这是一个维度表,我们需要正确维护有效的从和有效的到,下面是表和示例数据表的自动增量日期字段和oracle sql版本,sql,oracle,date,sql-update,oracle-sqldeveloper,Sql,Oracle,Date,Sql Update,Oracle Sqldeveloper,我有一个表,在这个表中我有一个数据没有正确加载的数据完整性问题,因为这是一个维度表,我们需要正确维护有效的从和有效的到,下面是表和示例数据 create table TEST ( LOC_SID NUMBER(38,0), CITY VARCHAR2(180 BYTE), POSTAL_CD VARCHAR2(15 BYTE), EFFECTIVE_DT_FROM DATE, EFFECTIVE_DT_TO DATE, VERSION NUMBER(38,0) ); Insert into
create table TEST
(
LOC_SID NUMBER(38,0),
CITY VARCHAR2(180 BYTE),
POSTAL_CD VARCHAR2(15 BYTE),
EFFECTIVE_DT_FROM DATE,
EFFECTIVE_DT_TO DATE,
VERSION NUMBER(38,0)
);
Insert into TEST values (81910,'chicago',null,to_date('01.01.00 00:00:00','DD.MM.YY HH24:MI:SS'),to_date('31.12.99 23:59:59','DD.MM.YY HH24:MI:SS'),1);
Insert into TEST values (81911,'chicago',null,to_date('01.01.00 00:00:00','DD.MM.YY HH24:MI:SS'),to_date('31.12.99 23:59:59','DD.MM.YY HH24:MI:SS'),1);
Insert into TEST values (81912,'chicago',null,to_date('01.01.00 00:00:00','DD.MM.YY HH24:MI:SS'),to_date('31.12.99 23:59:59','DD.MM.YY HH24:MI:SS'),1);
Insert into TEST values (81913,'chicago',null,to_date('01.01.00 00:00:00','DD.MM.YY HH24:MI:SS'),to_date('31.12.99 23:59:59','DD.MM.YY HH24:MI:SS'),1);
Insert into TEST values (81914,'chicago',null,to_date('01.01.00 00:00:00','DD.MM.YY HH24:MI:SS'),to_date('31.12.99 23:59:59','DD.MM.YY HH24:MI:SS'),1);
数据完整性检查查询
SELECT count(*) AS RowAffected
FROM
(SELECT LOC_SID,
VERSION,
EFFECTIVE_DT_FROM,
EFFECTIVE_DT_TO,
CITY,
POSTAL_CD
FROM
(SELECT t.*,
LEAD(EFFECTIVE_DT_FROM, 1) OVER(PARTITION BY CITY, POSTAL_CD
ORDER BY EFFECTIVE_DT_FROM) AS next_date,
LEAD(VERSION, 1) OVER(PARTITION BY CTY, POSTAL_CD
ORDER BY EFFECTIVE_DT_FROM) AS next_version
FROM TEST t)
WHERE valid_to != next_date
OR VERSION = next_version)
结果
CITY POSTAL_CD COUNT(*)
chicago N/A 150
N/A N/A 400
现有数据集
LOC_SID CITY POSTAL_CD EFFECTIVE_DT_FROM EFFECTIVE_DT_TO VERSION
81910 CHICAGO N/A 01.01.1900 31.12.2199 1
81911 CHICAGO N/A 01.01.1900 31.12.2199 1
81912 CHICAGO N/A 01.01.1900 31.12.2199 1
81913 CHICAGO N/A 01.01.1900 31.12.2199 1
81914 CHICAGO N/A 01.01.1900 31.12.2199 1
LOC_SID CITY POSTAL_CD EFFECTIVE_DT_FROM EFFECTIVE_DT_TO VERSION
81910 CHICAGO N/A 01.01.1900 01.01.2017 1
81911 CHICAGO N/A 01.01.2017 02.01.2017 2
81912 CHICAGO N/A 02.01.2017 03.01.2017 3
81913 CHICAGO N/A 03.01.1900 04.01.2017 4
81914 CHICAGO N/A 04.01.2017 31.12.2199 5
预期数据集
LOC_SID CITY POSTAL_CD EFFECTIVE_DT_FROM EFFECTIVE_DT_TO VERSION
81910 CHICAGO N/A 01.01.1900 31.12.2199 1
81911 CHICAGO N/A 01.01.1900 31.12.2199 1
81912 CHICAGO N/A 01.01.1900 31.12.2199 1
81913 CHICAGO N/A 01.01.1900 31.12.2199 1
81914 CHICAGO N/A 01.01.1900 31.12.2199 1
LOC_SID CITY POSTAL_CD EFFECTIVE_DT_FROM EFFECTIVE_DT_TO VERSION
81910 CHICAGO N/A 01.01.1900 01.01.2017 1
81911 CHICAGO N/A 01.01.2017 02.01.2017 2
81912 CHICAGO N/A 02.01.2017 03.01.2017 3
81913 CHICAGO N/A 03.01.1900 04.01.2017 4
81914 CHICAGO N/A 04.01.2017 31.12.2199 5
修复并运行数据完整性检查查询后我应该得到0行
如何使有效\u DT\u从,有效\u DT\u到和版本递增如果记录很少,我会手动调整和更新它,但我有很多行,如何修复
我尝试了下面的查询,但这只会更新唯一的版本,但无法解决问题
merge into TEST a
using
(
select LOC_SID,CITY,POSTAL_CD,EFFECTIVE_DT_FROM,EFFECTIVE_DT_TO,VERSION
,rank() over(partition by CITY,POSTAL_CD order by LOC_SID ) rnk
from TEST
where CITY='CHICAGO'
)b
on (a.LOC_SID = b.LOC_SID)
when matched then update set
a.VERSION=b.rnk;
我注意到我有一个场景
LOC_SID CITY POSTAL_CD EFFECTIVE_DT_FROM EFFECTIVE_DT_TO VERSION
25101 ASSAM 1153 01.01.1900 31.12.2199 1
25102 ASSAM 1153 01.01.1900 31.12.2199 1
25103 ASSAM 1290 01.01.1900 31.12.2199 1
25104 ASSAM 1290 01.01.1900 31.12.2199 1
25105 ASSAM 1310 01.01.1900 31.12.2199 1
25106 ASSAM 1310 01.01.1900 31.12.2199 1
25107 ASSAM 1781 01.01.1900 31.12.2199 1
25108 ASSAM 1781 01.01.1900 31.12.2199 1
25109 ASSAM 1982 01.01.1900 31.12.2199 1
25110 ASSAM 1982 01.01.1900 31.12.2199 1
我有31个这样的案例,当我尝试你的合并查询时,它不起作用,我有下面的结果集
LOC_SID CITY POSTAL_CD EFFECTIVE_DT_FROM EFFECTIVE_DT_TO VERSION
25101 ASSAM 1153 01.01.1900 01.01.2017 1
25102 ASSAM 1153 01.01.1900 31.12.2199 1
25103 ASSAM 1290 01.01.1900 01.01.2017 1
25104 ASSAM 1290 01.01.1900 31.12.2199 1
25105 ASSAM 1310 01.01.1900 01.01.2017 1
25106 ASSAM 1310 01.01.1900 31.12.2199 1
25107 ASSAM 1781 01.01.1900 01.01.2017 1
25108 ASSAM 1781 01.01.1900 31.12.2199 1
25109 ASSAM 1982 01.01.1900 01.01.2017 1
25110 ASSAM 1982 01.01.1900 31.12.2199 1
我认为您使用
merge
和row_number()
的逻辑是正确的(尽管,据推测,按划分子句是不需要的,因为您已经在城市上进行筛选了)。我用额外的逻辑扩展它来处理日期:
- 起始
有效\u dtu from
和最终有效\u dtu to
应保持不变
- 在这两者之间,您希望从
'2017-01-01'
开始逐日递增日期
查询:
merge into test t
using (
select
t.*,
row_number() over(order by loc_sid asc) rn,
count(*) over() cnt
from test t
where city = 'Chicago'
) t1
on (t1.loc_sid = t.loc_id)
when matched the update set
t.version = t1.rn,
t.effective_dt_from =
case
when rn = 1 then t.effective_dt_from
else date '2017-01-01' + rn - 2
end,
t.effective_dt_to =
case
when rn = cnt then t.effective_dt_to
else date '2017-01-01' + rn - 1
end
我认为您使用merge
和row_number()
的逻辑是正确的(尽管,据推测,按划分子句是不需要的,因为您已经在城市上进行筛选了)。我用额外的逻辑扩展它来处理日期:
- 起始
有效\u dtu from
和最终有效\u dtu to
应保持不变
- 在这两者之间,您希望从
'2017-01-01'
开始逐日递增日期
查询:
merge into test t
using (
select
t.*,
row_number() over(order by loc_sid asc) rn,
count(*) over() cnt
from test t
where city = 'Chicago'
) t1
on (t1.loc_sid = t.loc_id)
when matched the update set
t.version = t1.rn,
t.effective_dt_from =
case
when rn = 1 then t.effective_dt_from
else date '2017-01-01' + rn - 2
end,
t.effective_dt_to =
case
when rn = cnt then t.effective_dt_to
else date '2017-01-01' + rn - 1
end
您好@GMB感谢tunning我已经测试过的查询它正在工作,但我有一个新的场景上面的查询不工作,有什么建议吗?@rakesh:您应该为此提出一个新问题,提供样本数据和预期结果。-@GMBHi@GMB感谢您对我测试过的查询进行tunning,它正在工作,但我有一个新的场景上面的查询不工作,有什么建议吗?@rakesh:您应该为此提出一个新问题,提供样本数据和预期结果。-@专线小巴