将一个组的连续日期合并在一起
我有一个看起来像这样的员工的桌子:
名称 | 部门 | 经理 | 日期 |
---|---|---|---|
员工1 | 部门1 | 经理x | 202101 |
员工1 | dept 1 | Manager x | 202102 |
雇员1雇员1 | dept 2 | Manager x | 202103 |
雇员1 | 雇员1部长2 | 经理X | 202104 |
雇员1部门1 | Manager 1 | Manager x | 202105 |
员工1 | 部门1 | 经理X | 202106 |
员工2 | 部门1 | 经理x | 202101 |
员工2 | 雇员2 dept 1 | Manager x | 202102 |
我需要构建以下格式显示数据的视图:
名称 | 部门 | 经理 | 有效_for_from | valos valy_to |
---|---|---|---|---|
雇员1 | dept 1 | Manager x | 202101 | 202102 |
雇员1 | 部门2 | Manager x | 202103 | 202104 |
员工1 | 部门1 | Manager x | 202105 | 999912 |
员工2 | dept 1 | Manager x | 202101 | 999912 |
到目前为止,这就是为什么代码的样子:
WITH cte AS
(
SELECT [Name], Department, Manager, Valid_From = min([Date]), Valid_To = max([Date]),
RowNum = ROW_NUMBER() OVER (PARTITION BY [Name], ORDER BY max([Date]) DESC)
FROM TestingTable
WHERE ([Date] IS NOT NULL)
GROUP BY [Name], Department, Manager
)
SELECT [Name], Department, Manager, Valid_From,
CASE WHEN RowNum = 1 THEN 999912 ELSE Valid_To END AS Valid_To, CASE WHEN RowNum = 1 THEN 1 ELSE 0 END AS Is_Latest
FROM cte
输出就是这样 - IT组在雇员1在部门的间隔工作,该雇员1在部门工作了1,虽然我需要以2个不同的时间间隔。
名称 | 部门 | 经理 | 有效 | _for_to |
---|---|---|---|---|
雇员1 | 部门1 | 经理X | 202101 | 999912 |
员工1 | 部门2 | Manager x | 202103 | 202104 |
员工2 | dept 1 | Manager x | 202101 | 999912 |
我尝试了一些lag和Lag功能以比较日期,但我迷失了。
I have a table with employees that looks like this:
Name | Department | Manager | Date |
---|---|---|---|
Employee 1 | Dept 1 | Manager X | 202101 |
Employee 1 | Dept 1 | Manager X | 202102 |
Employee 1 | Dept 2 | Manager X | 202103 |
Employee 1 | Dept 2 | Manager X | 202104 |
Employee 1 | Dept 1 | Manager X | 202105 |
Employee 1 | Dept 1 | Manager X | 202106 |
Employee 2 | Dept 1 | Manager X | 202101 |
Employee 2 | Dept 1 | Manager X | 202102 |
I need to build a view that shows the data in the following format:
Name | Department | Manager | Valid_From | Valid_To |
---|---|---|---|---|
Employee 1 | Dept 1 | Manager X | 202101 | 202102 |
Employee 1 | Dept 2 | Manager X | 202103 | 202104 |
Employee 1 | Dept 1 | Manager X | 202105 | 999912 |
Employee 2 | Dept 1 | Manager X | 202101 | 999912 |
So far, this is what why code looks like:
WITH cte AS
(
SELECT [Name], Department, Manager, Valid_From = min([Date]), Valid_To = max([Date]),
RowNum = ROW_NUMBER() OVER (PARTITION BY [Name], ORDER BY max([Date]) DESC)
FROM TestingTable
WHERE ([Date] IS NOT NULL)
GROUP BY [Name], Department, Manager
)
SELECT [Name], Department, Manager, Valid_From,
CASE WHEN RowNum = 1 THEN 999912 ELSE Valid_To END AS Valid_To, CASE WHEN RowNum = 1 THEN 1 ELSE 0 END AS Is_Latest
FROM cte
The output is this - it groups the intervals that employee 1 has worked in department 1, while I need it in 2 different chronological intervals.
Name | Department | Manager | Valid_From | Valid_To |
---|---|---|---|---|
Employee 1 | Dept 1 | Manager X | 202101 | 999912 |
Employee 1 | Dept 2 | Manager X | 202103 | 202104 |
Employee 2 | Dept 1 | Manager X | 202101 | 999912 |
I experimented a bit with the lag and lead functions to compare the dates, but I'm lost.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
看来您需要连续将每个员工 - 居民经理人分组在一起。可以这样做:
请注意,我必须将年度月份转换为日期,以便更容易地进行比较。结果:
用
9999-12-01
是trivial例如,您可以检查Lead(有效_from)是否(按vall valom按名称顺序划分)
为null。Looks like you need to group consecutive year-months per employee-department-manager together. It could be done like so:
Note that I had to convert the year-months to dates for easier comparison. Result:
Replacing the last
valid_to
for each employee with9999-12-01
is trivial e.g. you can check iflead(valid_from) over (partition by name order by valid_from)
is null.Looks like a kind of gaps and islands problem with a twist regarding the open intervals detection
db<>小提琴
Looks like a kind of gaps and islands problem with a twist regarding the open intervals detection
db<>fiddle
尝试以下操作:
它缺少999912,因为我不了解在底部两行中更换的逻辑。
try this:
its missing the 999912 as I dont understand the logic for replacement in the bottom two rows.