在 flag = 'Y' 的表中读取多行的逻辑

Posted

技术标签:

【中文标题】在 flag = \'Y\' 的表中读取多行的逻辑【英文标题】:Logic to read multiple rows in a table where flag = 'Y'在 flag = 'Y' 的表中读取多行的逻辑 【发布时间】:2021-09-15 23:31:40 【问题描述】:

考虑以下场景。我有一个 Customer 表,其中包含 RowStart 和 EndDate 逻辑,因此每次更新字段值时都会写入一个新行。

此表中的相关字段为:

RowStartDate

RowEndDate

CustomerNumber

EmployeeFlag

为此,我想编写一个查询,它将返回员工的任期(EmploymentStartDateEmploymentEndDate)。 IE。 RowStartDateEmployeeFlag 第一次变成'Y',然后第一个RowStartDate 其中EmployeeFlag 变成'N'(当然,按RowStartDate asc 排序)。还有一个额外的复杂性是,一个人的标志值可能会在 Y 和 N 之间多次变化,因为他们可能会成为员工、辞职,然后在以后再次被雇用。

Example table structure is:
| CustomerNo | StaffFlag | RowStartDate | RowEndDate |
| ---------- | --------- | ------------ | ---------- |
| 12         | N         | 2019-01-01   | 2019-01-14 |
| 12         | N         | 2019-01-14   | 2019-03-02 |
| 12         | Y         | 2019-03-02   | 2019-10-12 |
| 01         | Y         | 2020-03-13   | NULL       |
| 12         | N         | 2019-10-12   | 2020-01-01 |
| 12         | Y         | 2020-01-01   | NULL       |

输出可能类似于

| CustomerNo | StaffStartDate | StaffEndDate |
| ---------- | -------------- | ------------ |
| 12         | 2019-03-02     | 2019-10-12   |
| 01         | 2020-03-13     | NULL         |
| 12         | 2021-01-01     | NULL         |

任何关于我如何解决这个问题的想法都将不胜感激。

【问题讨论】:

样本数据和所需的输出会有所帮助。 根据问题指南,请展示您尝试过的内容并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。我们需要一个minimal reproducible example,其中包含示例数据和所需结果(格式化文本不是图像。 尝试添加表格以显示输出和表格结构,格式似乎不起作用 SELECT <fields> FROM YourTable WHERE StaffFlag = 'Y'? 从您的示例中,带有N 标志的行似乎完全不相关,所以只需select * from table where staffflag = 'Y' 如果这不能满足您的要求,您需要一个更好的示例来说明实际问题。 【参考方案1】:

确保按 ID 和日期对列进行排序:

select * 
from yourtable
order by CustomerNumber asc, 
EmployeeFlag desc,
RowStartDate asc, 
RowEndDate asc

这会为您提供每位员工随时间发生的所有变化的列表。

随后,您希望将两行映射为具有两列的单行(将两个日期映射为总体开始日期和结束日期)。其他人使用lead() 函数完成了此操作。详情请看这里:Merging every two rows of data in a column in SQL Server

【讨论】:

以上是关于在 flag = 'Y' 的表中读取多行的逻辑的主要内容,如果未能解决你的问题,请参考以下文章

如何找到逻辑真值表的输入数量?

加入一个特定的表会导致高逻辑读取

如何在没有任何重复行的情况下连接两个表中的表?

将 C# 对象列表中的多行数据插入 Oracle 12 数据库中的表中

从 excel 坐标放置任何逻辑代理

我可以对表中的列进行逻辑重新排序吗?