- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我导出了个人数据,我想将其导入到考虑历史记录的表中。我编写了单个 sql 步骤,但出现了两个问题:
1.有一个步骤让我得到了意想不到的约会
2:我想避免手动提交一些步骤并使用存储过程
表格是:
考虑历史记录要填写的表格:
CREATE TABLE person (
id INTEGER DEFAULT NULL
, name VARCHAR(50) DEFAULT NULL
, effective_dt DATE DEFAULT NULL
, expiry_dt DATE DEFAULT NULL
);
包含要导入的人员数据的表格:
CREATE TABLE person_stg (
id INTEGER DEFAULT NULL
, name VARCHAR(50) DEFAULT NULL
, export_dt DATE DEFAULT NULL
, import_flag TINYINT DEFAULT 0
);
-- Several exports which has to be imported
INSERT INTO person_stg (id, name, export_dt) VALUES
(1,'Jonn' , '2000-01-01')
, (2,'Marry' , '2000-01-01')
, (1,'John' , '2000-01-05')
, (2,'Marry' , '2000-01-06')
, (2,'Mary' , '2000-01-10')
, (3,'Samuel', '2000-01-10')
, (2,'Maria' , '2000-01-15')
;
以下第一步 (1) 使用人员的第一个状态填充表人员:
INSERT INTO person
SELECT a.id, a.name, a.export_dt, '9999-12-31' expiry_dt
FROM person_stg a
LEFT JOIN person_stg b
ON a.id = b.id
AND a.export_dt > b.export_dt
WHERE b.id IS NULL
;
SELECT * FROM person ORDER BY id, effective_dt;
+----+--------+--------------+------------+
| id | name | effective_dt | expiry_dt |
+----+--------+--------------+------------+
| 1 | Jonn | 2000-01-01 | 9999-12-31 |
| 2 | Marry | 2000-01-01 | 9999-12-31 |
| 3 | Samuel | 2000-01-10 | 9999-12-31 |
+----+--------+--------------+------------+
步骤 (2) 更改到期日期:
-- (2) Update expiry_dt where changes happened
UPDATE
person a
, person_stg b
SET a.expiry_dt = SUBDATE(b.export_dt,1)
WHERE a.id = b.id
AND a.name <> b.name
AND a.expiry_dt = '9999-12-31'
AND b.export_dt = (SELECT MIN(b.export_dt)
FROM person_stg c
WHERE b.id = c.id
AND c.import_flag = 0
)
;
SELECT * FROM person ORDER BY id, effective_dt;
+----+--------+--------------+------------+
| id | name | effective_dt | expiry_dt |
+----+--------+--------------+------------+
| 1 | Jonn | 2000-01-01 | 2000-01-04 |
| 2 | Marry | 2000-01-01 | 2000-01-09 |
| 3 | Samuel | 2000-01-10 | 9999-12-31 |
+----+--------+--------------+------------+
第三步(3)插入人员数据的第二状态:
-- (3) Insert new exports which has changes
INSERT INTO person
SELECT a.id, a.name, a.export_dt, '9999-12-31' expiry_dt
FROM person_stg a
INNER JOIN person b
ON a.id = b.id
AND b.expiry_dt = SUBDATE(a.export_dt,1)
AND a.export_dt > b.effective_dt
AND a.import_flag = 0
;
SELECT * FROM person ORDER BY id, effective_dt;
+----+--------+--------------+------------+
| id | name | effective_dt | expiry_dt |
+----+--------+--------------+------------+
| 1 | Jonn | 2000-01-01 | 2000-01-04 |
| 1 | John | 2000-01-05 | 9999-12-31 |
| 2 | Marry | 2000-01-01 | 2000-01-09 |
| 2 | Mary | 2000-01-10 | 9999-12-31 |
| 3 | Samuel | 2000-01-10 | 9999-12-31 |
+----+--------+--------------+------------+
最后一步 (4) 在 person_stg 上定义了插入的记录:
-- (4) Define imported records
UPDATE
person_stg a
, person b
SET import_flag = 1
WHERE a.id = b.id
AND a.export_dt = b.effective_dt
;
到目前为止,一切都很好。如果我重复步骤(2),我会得到下表:
+----+--------+--------------+------------+
| id | name | effective_dt | expiry_dt |
+----+--------+--------------+------------+
| 1 | Jonn | 2000-01-01 | 2000-01-04 |
| 1 | John | 2000-01-05 | 9999-12-31 |
| 2 | Marry | 2000-01-01 | 2000-01-09 |
| 2 | Mary | 2000-01-10 | 1999-12-31 | <--- ??? Should be 2000-01-14
| 3 | Samuel | 2000-01-10 | 9999-12-31 |
+----+--------+--------------+------------+
Mary/2000-01-10 的 expiry_dt 为 1999-12-31,而不是 2000-01-14。我不明白这是怎么发生的。
所以,我的问题是:
(1a) 为什么这次更新的到期日期给出了这个奇怪的日期?
(1b) 是否有比 (2) 更好的代码?
(2) 如何自动重复步骤 (2) 到 (4)?我只需要一些存储过程的提示。 -- (4) 定义导入的记录 更新 人_stg a , 人 b 设置导入标志 = 1 其中 a.id = b.id AND a.export_dt = b. effective_dt ;
最佳答案
如果我明白您想要做什么,您就不需要多步骤的过程。您只需查找每条记录的“结束日期”。这是使用相关子查询的方法:
SELECT p.*, export_dt as effdate,
COALESCE((SELECT export_dt - interval 1 day
FROM person_stg p2
WHERE p2.id = p.id AND
p2.export_dt > p.export_dt
ORDER BY p2.export_dt
LIMIT 1
), '9999-12-31') as enddate
FROM person_stg p;
您还可以使用变量执行某些操作。
我不确定这是否能回答您的问题,因为它用更简单的查询替换了整个过程。
关于MySQL/MariaDB : Historization - How do it better,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27470965/
有人可以谈谈处理短时间内高度 transient 的数据的“通用做法”或一般“可接受的做法” - 但必须具有多年的历史存在... 以一家小型旅游公司为例 - 预订旅游。乘客名单将非常灵活,直到旅行..
GWT 历史记录:com.google.gwt.user.client.History 有一个 back() 方法,可以将您带到以前的历史记录 token 。但是有没有办法获得以前历史 token 的
google-places-api 中历史地点支持的地点类型是什么。我尝试使用 historical_place 但它没有检索地点 最佳答案 这是你的答案 https://developers.goo
我导出了个人数据,我想将其导入到考虑历史记录的表中。我编写了单个 sql 步骤,但出现了两个问题: 1.有一个步骤让我得到了意想不到的约会 2:我想避免手动提交一些步骤并使用存储过程 表格是: 考虑历
因为我的网页上有很多流量,其中有在线聊天,所以我的 mysql 表“消息”过于拥挤。我不想使用 TIMESTAMPDIFF 删除数据,但我想将它们 move 到“历史”表。 10 分钟(600 秒)后
我的Mysql数据库中有一些历史数据表。 我想在同一个表中重复一天的历史数据。 表结构,带有一些示例数据: Id | Date | Value 1 | 2012-04-30 |
我正在尝试使用 Algolia 的 Android 离线 SDK。在文档中,它声明我需要将我的许可证 key 放入 offlineIndex.initLibrary("licenseKey"); 方法
我认为许多开发人员喜欢在 git gui blame 的帮助下调查源代码。如 commit for Linux-2.6.12-rc2 中所述(也有 mirrored at Github ),为此需要有
我是第一次尝试 IB。我正在尝试获取 $EUR 的历史数据,但出现错误: Error 162, reqId 3: Historical Market Data Service error messag
我正在使用 Laravel 作为后端开发来创建电子商务移动应用程序。 场景:我有一个产品表,其中存储有关产品的一些信息。每当用户购买产品时,他都会获得一条购买历史记录(其中将显示产品信息),该记录将存
我一定错过了一些明显的东西;然而,我正在努力寻找 Hibernate Envers 遇到的问题的答案。 假设我有一个名为 MyObject 的实体类,它是使用 envers 进行审核的。 如果我获取
我有一个庞大的现有订单管理应用程序。 现在,在主 ORDER 表中,我添加了一个新列:IS_HISTORICAL。如果其值为:TRUE,则表示订单现在是历史订单,不应显示在应用程序中。 现在,我必须修
让我从一个例子开始。假设我有以下缓慢变化的维度表片段,其中包含有关客户的信息: key id name country valid_from valid_to vers
我正在尝试使用此 url 作为示例访问 Yahoo 的 api(使用 PHP/Mysql 实现)上的历史数据: $url = http://ichart.finance.yahoo.com/table
我正在尝试弄清楚如何通过 python 中的 bloomberg api 获取历史引用数据。本质上,我试图在 python 中重现以下 excel BDH: =BDH("IBM US EQUITY",
我有一个依赖于查询字符串的单页在线应用程序。添加了 Google Analytics 跟踪,但是直到几天后才添加规范元,因此现在 Analytics 显示同一页面的多个条目,因为查询字符串不同,例如“
我需要将时间从 UTC 转换为用户选择的时区。我还必须将该时区的用户输入转换为以 UTC 存储。 目前时区以 Olson 格式定义(“美国/洛杉矶”)。 Linux 上使用 timegm 的解决方案很
您有两个表,foo 和 bar,它们具有 M:N 关系。 您想维护 foo 和 bar 的相当极端的历史版本,以及它们之间的关系,例如: 你在 Foo 中插入一行,然后在 Bar 中插入一行,然后在
我是一名资深程序员,对 DBMS 或设计数据库的经验很少。 我知道有类似的帖子,但今晚我感到很困惑。 我正在从事一个项目,该项目需要我每天多次存储大量报告,而且还没有处理过这种规模的存储或表格。请允许
我从 this 知道页面,有一个选项可以根据使用某些探索策略收集的历史上下文老虎机数据来训练上下文老虎机大众模型: VW contains a contextual bandit module whi
我是一名优秀的程序员,十分优秀!