Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Datetime 将一个日期范围映射到另一个日期范围的逻辑?_Datetime_Language Agnostic_Type 2 Dimension - Fatal编程技术网

Datetime 将一个日期范围映射到另一个日期范围的逻辑?

Datetime 将一个日期范围映射到另一个日期范围的逻辑?,datetime,language-agnostic,type-2-dimension,Datetime,Language Agnostic,Type 2 Dimension,我有一个带有开始和结束日期的用户历史记录表。我有第二个角色历史记录表,其中有开始和结束日期 我试图获取用户历史记录表,并将其与角色历史记录分开。基本上,我正在尝试将角色历史映射到用户历史 例如: 这是用户表 | person | title | roleid | start | end | |--------|-------------|--------|-----------|-------------| | a | VP | 1

我有一个带有开始和结束日期的用户历史记录表。我有第二个角色历史记录表,其中有开始和结束日期

我试图获取用户历史记录表,并将其与角色历史记录分开。基本上,我正在尝试将角色历史映射到用户历史

例如:

这是用户表

| person | title       | roleid | start     | end         |
|--------|-------------|--------|-----------|-------------|
| a      | VP          | 1      | 10/1/2017 | 10/31/2017  |
| a      | Director    | NULL   | 11/1/2017 | 11/25/2017  |
| a      | NULL        | 2      | 11/26/2017| 12/5/2017   |
| a      | President   | 3      | 12/6/2017 | 12/31/2017  |
| a      | Exec        | 3      | 01/01/2018| 12/31/2999  |
以及角色历史记录表


| roleid | role        | xxxxxx | start      | end         |
|--------|-------------|--------|------------|-------------|
| 1      | Champion    | x      | 10/05/2017 | 11/01/2017  |
| 2      | Nerd        | x      | 10/20/2017 | 12/31/2999  |
| 3      | Peon        | x      | 11/26/2017 | 12/15/2017  |
| 3      | King        | x      | 12/16/207  | 12/31/2017  |

我试图得到这样的结果:

| person | title       | role_id | role   | start      | end         |
|--------|-------------|---------|--------|------------|-------------|
| a      | VP          | NULL    |NULL    | 10/01/2017 | 10/04/2017  |
| a      | VP          | 1       |champion| 10/05/2017 | 10/31/2017  |
| a      | Director    | NULL    |NULL    | 11/01/2017 | 11/25/2017  |
| a      | NULL        | 2       |nerd    | 11/26/2017 | 12/05/2017  |
| a      | President   | 3       |peon    | 12/06/2017 | 12/15/2017  |
| a      | President   | 3       |King    | 12/16/2017 | 12/31/2017  |
| a      | Exec        | 3       |King    | 01/01/2018 | 12/31/2999  |
我试着用多个insert语句来处理这个问题,但逻辑一直出错。任何帮助都将不胜感激。

首先: 我在“用户表”中按行数函数创建虚拟主键,如下所示

select *,ROW_NUMBER() OVER(order by person ,start) as vkey from 'user table'
使用上表,我假装“很容易”通过vkey获得我们必须加入“角色历史表”的行:

    select vkey,rn 
from(select * ,ROW_NUMBER() OVER (PARTITION BY person,roleid 
order by start) as rn) from 'temptable')temp where rn<=1

我找到了一个对我有帮助的答案

“这里有两个类型2缓慢变化维度(SCD)。通常,当您查询此类数据时,您使用单个时间点对数据进行切片。但是重叠它们吗?”

这似乎很难做到,但是当你只有两个表要考虑并且你理解一些逻辑时,这个模式其实并不太坏。 首先,是。说真的,把这个答案记在书签里。它太神奇了,我已经回到它上面好几年了

您将在两个表的联接上应用该答案中的简化表达式:A.Start B.Start

这将以笛卡尔结果结束-这很好。每行的真正有效范围是两个表中最小的重叠窗口:

,当A.开始>B.开始然后A.开始其他B.开始结束时的情况 新的开始 ,当A.End 这将为您提供一个新的非规范化Type2 SCD结果集

如果您需要做两个以上的表…那么…我只需要编写脚本,逐步将两个表连接在一起,将上一个连接的结果向前转换到下一个,应用与上面相同的模式


希望这就是您想要的!

我是不是把这个问题弄得太复杂了?您能告诉我用户表的主键吗?若用户表中并没有主键,那个么要得到想要的结果就有点复杂了。我可以给你结果表几乎像你想要的,但恰恰是你想要的没有主键或关于你的表结构的更具体的细节。用户表的主键是:user_id,userroleid,title,department和team。角色表的主键是:角色id,角色名称上面的帖子来自一个名为PrettyGoodMonkey的Reddit用户。事实上,用户表的主键是:用户id,用户角色id,标题,部门和团队。角色表的主键是:角色id、角色名称。我之前的帖子也没有给出我想要的,所以希望能回头看看你的解决方案是否可行。
    select t1.person,t1.title,t1.role_id,t2.role,t1.start,t1.end from 'temptable' t1 
left join 'role history table' t2 on t1.role_id=t2.role_id 
and t1.vkey in (select vkey from 'keytable') order by t1.vkey