我正在尝试解决这样一个问题:每次更新某个项目时,我都有一个包含该项目不同版本的表。
| 人|磁盘A的资格|磁盘B的资格|版本开始|版本结束|
| - ------|- ------|- ------|- ------|- ------|
| 鲍勃|是|是|2022年1月1日|2022年1月4日|
| 鲍勃|是|数量|2022年1月5日|2022年1月13日|
| 鲍勃|数量|数量|2022年1月14日|2022年1月22日|
| 鲍勃|是|数量|2022年1月23日|十二月三十一日三○ ○ ○|
对于这个问题,我不关心这个人是否有资格享受折扣B,我只对折扣A感兴趣。我想做的是提出一个查询,它只在这个人每次享受折扣A的资格发生变化时返回一个新版本。
我想要的是以下内容被退回:
| 人|磁盘A的资格|版本开始|版本结束|
| - ------|- ------|- ------|- ------|
| 鲍勃|是|2022年1月1日|2022年1月13日|
| 鲍勃|数量|2022年1月14日|2022年1月22日|
| 鲍勃|是|2022年1月23日|十二月三十一日三○ ○ ○|
在本例中,前两行已合并,因为"折扣A的适用性"的值未更改。在我使用的示例中,表中还可以有许多不同的人员。
我试着看看是否按elig对disc a进行分组会起作用,但后来我得到了第1、2和4行都组合在一起。
这是SQL可以做到的吗?
5条答案
按热度按时间njthzxwz1#
或者使用匹配识别:
uqzxnwby2#
以下是可以在Oracle中使用的查询示例:
kadbb4593#
使用LAG或LEAD查找更改很容易。真实的的技巧是重构您的开始/结束日期以涵盖中间时间段。请尝试以下操作(未尝试,可能需要调试):
jqjz2hbq4#
这是一个典型的间隙和孤岛问题,在这种情况下,您需要标识同一分区中的孤岛(应该放在一起的记录)。我们可以按照以下三个步骤来查找孤岛之间的间隙:
输出:
| 人员|盘A的ELIG|版本_开始|版本_结束|
| - ------|- ------|- ------|- ------|
| 鲍勃|是|2022年1月1日|2022年1月13日|
| 鲍勃|数量|二十二年一月十四日|2022年1月22日|
| 鲍勃|是|2022年1月23日|二○ ○ ○年十二月三十一日|
查看Oracle演示here。
DATE
数据类型来存储日期。eagi6jfj5#
您可以使用1个case语句来获得正确的version_end日期,其余的1个带有LAG窗口函数的子查询将起作用-
Demo.