- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有很多研究人员观察着世界上最后剩下的unicorns,即Easter Island。每天,研究人员记录他们发现的 unicorn ,发现日期,每个 unicorn 的婴儿数量以及发现时是否喝醉了。这些分别被上载到中心位置,然后每天向我吐出一个平面文件,其中包含所有新观测值。
我有一个看起来像这样的表,其中包含以下信息:
create table unicorn_observations (
observer_id number not null
, unicorn_id number not null
, created date not null -- date the record was inserted into the database
, lastseen date not null -- date the record was last seen
, observation_date date not null
, no_of_babies number not null
, drunk varchar2(1) not null
, constraint pk_uo primary key ( observer_id, unicorn_id, created )
, constraint chk_uo_babies check ( no_of_babies >= 0 )
, constraint chk_uo_drunk check ( drunk in ('y','n') )
);
observer_id
,
unicorn_id
和
observation_date
或
lastseen
上分别是唯一的。
lastseen
而不是创建新记录。我仅在每列都相同的情况下执行此操作
observation_date
进行此操作,这意味着将一条新记录插入到表中。
created
和
lastseen
,以实现完全可追溯性,因为研究人员有时会晚些提交一些观察结果。这些由数据库创建,不属于提交的信息。
+--------+--------+-----------+-----------+-----------+---------+-------+| OBS_ID | UNI_ID | CREATED | LASTSEEN | OBS_DATE | #BABIES | DRUNK |+--------+--------+-----------+-----------+-----------+---------+-------+| 1 | 1 | 01-NOV-11 | 01-NOV-11 | 31-OCT-11 | 10 | n || 1 | 2 | 01-NOV-11 | 01-NOV-11 | 31-OCT-11 | 10 | n || 1 | 3 | 01-NOV-11 | 01-NOV-11 | 31-OCT-11 | 10 | n || 1 | 6 | 10-NOV-11 | 10-NOV-11 | 07-NOV-11 | 0 | n || 1 | 1 | 17-NOV-11 | 17-NOV-11 | 09-APR-11 | 10 | n || 1 | 2 | 17-NOV-11 | 17-NOV-11 | 09-APR-11 | 10 | n || 1 | 3 | 17-NOV-11 | 17-NOV-11 | 09-APR-11 | 10 | n || 1 | 6 | 17-NOV-11 | 17-NOV-11 | 17-NOV-11 | 0 | n || 1 | 6 | 01-DEC-11 | 01-DEC-11 | 01-DEC-11 | 0 | n || 1 | 6 | 01-JAN-12 | 01-JAN-12 | 01-JAN-12 | 3 | n || 1 | 6 | 01-FEB-12 | 01-FEB-12 | 01-FEB-12 | 0 | n || 1 | 6 | 01-MAR-12 | 01-MAR-12 | 01-MAR-12 | 0 | n || 1 | 6 | 01-APR-12 | 01-APR-12 | 01-APR-12 | 0 | n || 1 | 1 | 19-APR-12 | 19-APR-12 | 19-APR-12 | 7 | y || 1 | 2 | 19-APR-12 | 19-APR-12 | 19-APR-12 | 7 | y || 1 | 3 | 19-APR-12 | 19-APR-12 | 19-APR-12 | 7 | y || 1 | 6 | 01-MAY-12 | 01-MAY-12 | 01-MAY-12 | 0 | n |+--------+--------+-----------+-----------+-----------+---------+-------+
I would like to partially denormalise these observations so that if a new record is received with the same observer_id
, unicorn_id
, no_of_babies
and drunk
(the payload) but with a newer observation_date
I update a new column in the table, last_observation_date
, instead of inserting a new record. I would still update thelastseen
in this situation.
I need to do this as I have a number of complicated unicorn related queries that join to this table; the researchers upload old observations with new dates about 10m times a month and I receive approximately 9m genuinely new records a month. I've been running for a year and already have 225m unicorn observations. As I only need to know the last observation date for each payload combination I would rather massively reduce the size of the table and save myself a lot of time full-scanning it.
This means that the table would become:
create table unicorn_observations (
observer_id number not null
, unicorn_id number not null
, created date not null -- date the record was inserted into the database
, lastseen date not null -- date the record was last seen
, observation_date date not null
, no_of_babies number not null
, drunk varchar2(1) not null
, last_observation_date date
, constraint pk_uo primary key ( observer_id, unicorn_id, created )
, constraint chk_uo_babies check ( no_of_babies >= 0 )
, constraint chk_uo_drunk check ( drunk in ('y','n') )
);
last_observation_date
是否为null无关紧要。我在加载数据时不需要帮助,仅需要将当前表进行部分非规范化即可。
+--------+--------+-----------+-----------+-----------+---------+-------+-------------+| OBS_ID | UNI_ID | CREATED | LASTSEEN | OBS_DATE | #BABIES | DRUNK | LAST_OBS_DT |+--------+--------+-----------+-----------+-----------+---------+-------+-------------+| 1 | 6 | 10-NOV-11 | 01-DEC-11 | 07-NOV-11 | 0 | n | 01-DEC-11 || 1 | 1 | 01-NOV-11 | 17-NOV-11 | 09-APR-11 | 10 | n | 31-OCT-11 || 1 | 2 | 01-NOV-11 | 17-NOV-11 | 09-APR-11 | 10 | n | 31-OCT-11 || 1 | 3 | 01-NOV-11 | 17-NOV-11 | 09-APR-11 | 10 | n | 31-OCT-11 || 1 | 6 | 01-JAN-12 | 01-JAN-12 | 01-JAN-12 | 3 | n | || 1 | 6 | 01-FEB-12 | 01-MAY-12 | 01-FEB-12 | 0 | n | 01-MAY-12 || 1 | 1 | 19-APR-12 | 19-APR-12 | 19-APR-12 | 7 | y | || 1 | 2 | 19-APR-12 | 19-APR-12 | 19-APR-12 | 7 | y | || 1 | 3 | 19-APR-12 | 19-APR-12 | 19-APR-12 | 7 | y | |+--------+--------+-----------+-----------+-----------+---------+-------+-------------+
The obvious answer
select observer_id as obs_id
, unicorn_id as uni_id
, min(created) as created
, max(lastseen) as lastseen
, min(observation_date) as obs_date
, no_of_babies as "#BABIES"
, drunk
, max(observation_date) as last_obs_date
from unicorn_observations
group by observer_id
, unicorn_id
, no_of_babies
, drunk
lastseen
不正确。
created
日期的数量)。即使使用
lag()
和
lead()
,也需要进行递归,因为每个 unicorn 的观察次数不确定。
最佳答案
基于我认为您正在尝试做的事情,主要是基于有关 unicorn 6特定问题的更新,我认为这可以达到您想要的结果。它不需要递归lead
和lag
,但是需要两个级别。
select *
from (
select observer_id, unicorn_id,
case when first_obs_dt is null then created
else lag(created) over (order by rn) end as created,
case when last_obs_dt is null then lastseen
else lead(lastseen) over (order by rn) end as lastseen,
case when first_obs_dt is null then observation_date
else lag(observation_date) over (order by rn)
end as observation_date,
no_of_babies,
drunk,
case when last_obs_dt is null then observation_date
else null end as last_obs_dt
from (
select observer_id, unicorn_id, created, lastseen,
observation_date, no_of_babies, drunk,
case when lag_no_babies != no_of_babies or lag_drunk != drunk
or lag_obs_dt is null then null
else lag_obs_dt end as first_obs_dt,
case when lead_no_babies != no_of_babies or lead_drunk != drunk
or lead_obs_dt is null then null
else lead_obs_dt end as last_obs_dt,
rownum rn
from (
select observer_id, unicorn_id, created, lastseen,
observation_date, no_of_babies, drunk,
lag(observation_date)
over (partition by observer_id, unicorn_id, no_of_babies,
drunk
order by observation_date) lag_obs_dt,
lag(no_of_babies)
over (partition by observer_id, unicorn_id, drunk
order by observation_date) lag_no_babies,
lag(drunk)
over (partition by observer_id, unicorn_id, no_of_babies
order by observation_date) lag_drunk,
lead(observation_date)
over (partition by observer_id, unicorn_id, no_of_babies,
drunk
order by observation_date) lead_obs_dt,
lead(no_of_babies)
over (partition by observer_id, unicorn_id, drunk
order by observation_date) lead_no_babies,
lead(drunk)
over (partition by observer_id, unicorn_id, no_of_babies
order by observation_date) lead_drunk
from unicorn_observations
order by 1,2,5
)
)
where first_obs_dt is null or last_obs_dt is null
)
where last_obs_dt is not null
order by 1,2,3,4;
OBSERVER_ID UNICORN_ID CREATED LASTSEEN OBSERVATI NO_OF_BABIES D LAST_OBS_
----------- ---------- --------- --------- --------- ------------ - ---------
1 1 17-NOV-11 01-NOV-11 09-APR-11 10 n 31-OCT-11
1 1 19-APR-12 19-APR-12 19-APR-12 7 y 19-APR-12
1 2 17-NOV-11 01-NOV-11 09-APR-11 10 n 31-OCT-11
1 2 19-APR-12 19-APR-12 19-APR-12 7 y 19-APR-12
1 3 17-NOV-11 01-NOV-11 09-APR-11 10 n 31-OCT-11
1 3 19-APR-12 19-APR-12 19-APR-12 7 y 19-APR-12
1 6 10-NOV-11 01-DEC-11 07-NOV-11 0 n 01-DEC-11
1 6 01-JAN-12 01-JAN-12 01-JAN-12 3 n 01-JAN-12
1 6 01-FEB-12 01-MAY-12 01-FEB-12 0 n 01-MAY-12
9 rows selected.
lastseen
和
observation_date
与您的示例相反,因此我不确定是否仍然不了解这一点。我假设您想在每个分组中保留最早的
observation_date
和最新的
lastseen
,理由是添加新记录时似乎会发生这种情况,但是我不确定...
lead
和
lag
和
observation_date
列的
no_of_babies
和
drunk
。
order by
是一个
rownum
,因此可以在以后使用,在下一步中获得并在之后的顺序中使用。为了简洁起见,只为 unicorn 6:
CREATED LASTSEEN OBSERVATI NO_OF_BABIES D LAG_OBS_D LAG_NO_BABIES L LEAD_OBS_ LEAD_NO_BABIES L
--------- --------- --------- ------------ - --------- ------------- - --------- -------------- -
10-NOV-11 10-NOV-11 07-NOV-11 0 n 17-NOV-11 0 n
17-NOV-11 17-NOV-11 17-NOV-11 0 n 07-NOV-11 0 n 01-DEC-11 0 n
01-DEC-11 01-DEC-11 01-DEC-11 0 n 17-NOV-11 0 n 01-FEB-12 3 n
01-JAN-12 01-JAN-12 01-JAN-12 3 n 0 0
01-FEB-12 01-FEB-12 01-FEB-12 0 n 01-DEC-11 3 n 01-MAR-12 0 n
01-MAR-12 01-MAR-12 01-MAR-12 0 n 01-FEB-12 0 n 01-APR-12 0 n
01-APR-12 01-APR-12 01-APR-12 0 n 01-MAR-12 0 n 01-MAY-12 0 n
01-MAY-12 01-MAY-12 01-MAY-12 0 n 01-APR-12 0 n
lead
或
lag
值已更改,则下一个级别将
observation_date
的
num_of_babies
和
drunk
值置为空白-您仅专门提到了对婴儿计数的分割,但是我假设您也希望对清醒度进行分割。此后,任何具有
null
或
first_obs_date
的
last_obs_date
的东西都是小范围的开始或结束。
CREATED LASTSEEN OBSERVATI NO_OF_BABIES D FIRST_OBS LAST_OBS_ RN
--------- --------- --------- ------------ - --------- --------- ----------
10-NOV-11 10-NOV-11 07-NOV-11 0 n 17-NOV-11 1
17-NOV-11 17-NOV-11 17-NOV-11 0 n 07-NOV-11 01-DEC-11 2
01-DEC-11 01-DEC-11 01-DEC-11 0 n 17-NOV-11 3
01-JAN-12 01-JAN-12 01-JAN-12 3 n 4
01-FEB-12 01-FEB-12 01-FEB-12 0 n 01-MAR-12 5
01-MAR-12 01-MAR-12 01-MAR-12 0 n 01-FEB-12 01-APR-12 6
01-APR-12 01-APR-12 01-APR-12 0 n 01-MAR-12 01-MAY-12 7
01-MAY-12 01-MAY-12 01-MAY-12 0 n 01-APR-12 8
first_obs_dt
和
last_obs_dt
都不为空的行来消除这些中间值。在该过滤后的集合中,有第二层
lead
和
lag
来获取每个日期的第一个或最后一个值-这是我不确定的一点,因为它与您的一个样本都不匹配。
CREATED LASTSEEN OBSERVATI NO_OF_BABIES D LAST_OBS_
--------- --------- --------- ------------ - ---------
10-NOV-11 01-DEC-11 07-NOV-11 0 n
10-NOV-11 01-DEC-11 07-NOV-11 0 n 01-DEC-11
01-JAN-12 01-JAN-12 01-JAN-12 3 n 01-JAN-12
01-FEB-12 01-MAY-12 01-FEB-12 0 n
01-FEB-12 01-MAY-12 01-FEB-12 0 n 01-MAY-12
last_obs_dt
的行过滤掉。
lead
和
lag
顺序后, unicorn 1的每个阶段的信息相同:
CREATED LASTSEEN OBSERVATI NO_OF_BABIES D LAG_OBS_D LAG_NO_BABIES L LEAD_OBS_ LEAD_NO_BABIES L
--------- --------- --------- ------------ - --------- ------------- - --------- -------------- -
17-NOV-11 17-NOV-11 09-APR-11 10 n 31-OCT-11 10 n
01-NOV-11 01-NOV-11 31-OCT-11 10 n 09-APR-11 10 n
19-APR-12 19-APR-12 19-APR-12 7 y
CREATED LASTSEEN OBSERVATI NO_OF_BABIES D FIRST_OBS LAST_OBS_ RN
--------- --------- --------- ------------ - --------- --------- ----------
17-NOV-11 17-NOV-11 09-APR-11 10 n 31-OCT-11 1
01-NOV-11 01-NOV-11 31-OCT-11 10 n 09-APR-11 2
19-APR-12 19-APR-12 19-APR-12 7 y 3
CREATED LASTSEEN OBSERVATI NO_OF_BABIES D LAST_OBS_
--------- --------- --------- ------------ - ---------
17-NOV-11 17-NOV-11 09-APR-11 10 n 09-APR-11
19-APR-12 19-APR-12 19-APR-12 7 y 19-APR-12
observation_date
和
lastseen
会发生什么变化,或者在将来添加新记录的情况下该如何处理。
关于sql - unicorn 观测结果的部分非规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12723776/
我正在寻找一个库函数来规范化 Python 中的 URL,即删除路径中的“./”或“../”部分,或添加默认端口或转义特殊字符等。结果应该是指向同一网页的两个 URL 唯一的字符串。例如 http:/
我有 2 个版本的 XSD 文件,我想看看它们之间做了哪些更改。不幸的是,发布者选择完全重写 XSD,更改元素、属性、命名空间前缀等的顺序。是否有工具(命令行或 GUI)可以将它们转换为我可以使用的规
我一直在想,同时使用 normalize.css 和某种 CSS 重置会不会有什么大问题?我一直在四处挖掘,我遇到的所有文章都只是以非此即彼的方式谈论它们,而没有谈及将两者结合起来。 诚然,我在规范化
这对我来说是一个新话题,我已经阅读了几篇文章,但我仍然不清楚,甚至不确定以下问题是否与这篇文章的标题有关。 我的系统向用户发送数据。用户可以选择通过以下方式发送数据: XML 电子邮件 发布 根据用户
我正在从设计不佳的旧数据库升级到新数据库。在旧数据库中有带有字段 Id 和 Commodities 的 tableA。 Id 是主键,包含一个 int,Commodities 包含一个逗号分隔的列表。
假设我有包含此字符串的 Apache Solr 索引文档: Klüft skräms inför 我希望能够使用此关键字通过搜索找到它(注意“u”-“ü”): kluft 有没有办法做到这一点 ? 最
假设您正在处理常规的联系人数据库(您知道...姓名,电话号码,地址,电子邮件等...)。如果您在本地对此感到疑惑,那么一般来说这不是什么大问题,但是当我们查看国际场景时,它就是。 查看电话号码系统,您
尝试在不使用 python 中的任何包的情况下计算 L1 范数 假设我有向量:l = [2.34, 3.32, 6.32, 2.5, 3,3, 5.32] 我想找到这个向量的L1,没有任何包: 我已经
我们拥有 10 年的存档体育数据,分布在不同的数据库中。 尝试将所有数据合并到一个数据库中。由于我们将处理 10 倍的记录数量,因此我现在正在尝试重新设计架构以避免潜在的性能影响。 一项更改是将团队名
我正在使用以下设计为我的网站创建表格 设计1 设计2 由于并非所有注册用户都会尝试挑战,因此设计 1 适合。插入第三个表时,表 2 分数会相应更新。但是 user_id 字段变得多余。 设计 2 中为
我有一个带有字段 json 的表模板。由于 json 对于许多 template 来说可能是相同的 (1:n),我创建了另一个表 template_json 并添加了字段 template_json_
我有一个具有正交投影的 C++/OpenGl/Glut 应用程序。 窗口的宽度为 500 x 500 像素。目前,当鼠标点击发生时,该点将在 (0,0) 和 (500, 500) 之间。 我想获取该点
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我的印象是 JavaScript 解释器假设它正在解释的源代码已经被规范化。什么,规范化到底是做什么的?它不能是文本编辑器,否则源的明文表示会改变。是否有一些执行规范化的“预处理器”? 最佳答案 EC
我被分配了一项任务,但我不确定如何完成它: 我必须构建一个支持多种设备的消息系统,并且它应该尽可能高效。用户最多可以有 10 台设备,当用户收到消息时,所有设备都需要接收消息。 我有两个想法: Tab
我正在尝试将规范化合并到我的数据库设计中,互联网上提供的一些解释让我有点困惑 - 我不确定我是否在朝着正确的方向前进? 到目前为止我有: 用户: id username password 用户配置文件
规范化数据时,是否可以接受在同一张表中重复使用外键? 例如一家 express 公司有一个订单表和一个客户表,订单表会记录从哪个客户那里取件(Customer_ID),并且还会有一列用于说明要交付给哪
用 Java 制作规范形式的 XML 文件的最简单方法是什么?你有一些完成的代码吗?我在网上找到了几个链接,比如 this , this , 和 this ,但我无法让它工作:/ 谢谢, 伊凡 编辑:
在 Python 中是否有标准方法来规范化 unicode 字符串,以便它只理解可用于表示它的最简单的 unicode 实体? 我的意思是,可以将 ['LATIN SMALL LETTER A', '
我知道这个问题已经讨论了很多——但实际上我还没有找到这个问题的最终答案。 我想从我的 VBA(Excel)脚本中的日期“删除”(或更确切地说是标准化)时间。例如。: 20.12.2017 15:16
我是一名优秀的程序员,十分优秀!