SQL等级计数事件
我想在时间段获得工作职位,类似此类
登录录音 | 从 | 有效到 | Jobposition |
---|---|---|---|
BCDE BCDE | 2019-07-01 | 2019-09-09-09-30 | 项目经理 |
BCDE BCDE | 2020-01-09 2020-09 | 2020-06-16-16 | 卓越中心主任 |
BCDE | 2020-06-17 | 2021-07-31 | 团队负责人 |
BCDE BCDE | 2021-08-01 | 2099-12-31 | 卓越中心主任卓越中心主任, |
所以我写了查询:
select DimEmployeeId, JobPosition, login, min(ValidFrom), max(ValidTo)
from employeeContracts
group by DimEmployeeId, JobPosition, login
但是在这种情况下它不起作用(如果在这种情况下都不起作用(如果 所以我决定使用dense_rank,这样:
select login, ValidFrom, ValidTo, JobPosition
,dense_rank() OVER (Partition BY JobPosition ORDER BY login, ValidFrom, ValidTo, JobPosition) as no
from employeeContracts
问题
select DimEmployeeId, JobPosition, login, min(ValidFrom), max(ValidTo)
from employeeContracts
group by DimEmployeeId, JobPosition, no, login
无法正常工作
, | 相同的工作意见) , | 有人具有 | dense_rank | 此后 |
---|---|---|---|---|
是 | ; -01 | 2019-09-30 | 经理 | 1 |
BCDE | 2020-01-09 | 2020-06-16 | 卓越 | 中心 |
| | | 负责 | 项目 |
| | -31 | 团队负责人 | 3 |
BCDE | 2021-04-01 | 2021-06-30 | 团队负责人 | 3 |
BCDE | 2021-07-01 | 2021-07-31 | 团队领导者 | 3 |
BCDE | 2021-08-01 | 2021-2021-2021-12-31 | 卓越中心 | 4 |
BCDE | 2022-01-01 | 2022-05-09 | 卓越中心负责人 | 4 |
BCDE | 2022-02-01 | 2022-05-09 | 主管 | 4 |
BCDE | 2022-09 | 209999999999999-12-31 | 卓越中心 | 4 |
之后使用查询获得最终结果:
select DimEmployeeId, JobPosition, login, min(ValidFrom), max(ValidTo)
from employeeContracts
group by DimEmployeeId, JobPosition, no, login
示例数据方案
CREATE TABLE employeeContracts (
login text,
ValidFrom datetime,
ValidTo datetime,
JobPosition text
);
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2019-07-01', '2019-09-30', 'Project Manager');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2020-01-09', '2020-06-16', 'Head of Center of Excellence');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2020-06-17', '2020-07-31', 'Team Leader');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2020-08-01', '2021-03-31', ' Team Leader');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2021-04-01', '2021-06-30', ' Team Leader');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2021-07-01', '2021-07-31', ' Team Leader');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2021-08-01', '2021-12-31', ' Head of Center of Excellence');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2022-01-01', ' 2022-05-09', 'Head of Center of Excellence');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2022-02-01', '2022-05-09', 'Head of Center of Excellence');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2022-05-09', '2099-12-31', 'Head of Center of Excellence');
可以测试在这里
In my table I have data from employee contracts like this:
And I want to get job position in time periods, something like this
login | ValidFrom | ValidTo | JobPosition |
---|---|---|---|
bcde | 2019-07-01 | 2019-09-30 | Project Manager |
bcde | 2020-01-09 | 2020-06-16 | Head of Center of Excellence |
bcde | 2020-06-17 | 2021-07-31 | Team Leader |
bcde | 2021-08-01 | 2099-12-31 | Head of Center of Excellence |
So I write query:
select DimEmployeeId, JobPosition, login, min(ValidFrom), max(ValidTo)
from employeeContracts
group by DimEmployeeId, JobPosition, login
But It doesn't work in this case (if someone has the same JobPosition), so I decided to use dense_rank, like this:
select login, ValidFrom, ValidTo, JobPosition
,dense_rank() OVER (Partition BY JobPosition ORDER BY login, ValidFrom, ValidTo, JobPosition) as no
from employeeContracts
and after that
select DimEmployeeId, JobPosition, login, min(ValidFrom), max(ValidTo)
from employeeContracts
group by DimEmployeeId, JobPosition, no, login
but problem is dense_rank doesn't work as I need ;) I want to get something like this:
login | ValidFrom | ValidTo | JobPosition | no |
---|---|---|---|---|
bcde | 2019-07-01 | 2019-09-30 | Project Manager | 1 |
bcde | 2020-01-09 | 2020-06-16 | Head of Center of Excellence | 2 |
bcde | 2020-06-17 | 2020-07-31 | Team Leader | 3 |
bcde | 2020-08-01 | 2021-03-31 | Team Leader | 3 |
bcde | 2021-04-01 | 2021-06-30 | Team Leader | 3 |
bcde | 2021-07-01 | 2021-07-31 | Team Leader | 3 |
bcde | 2021-08-01 | 2021-12-31 | Head of Center of Excellence | 4 |
bcde | 2022-01-01 | 2022-05-09 | Head of Center of Excellence | 4 |
bcde | 2022-02-01 | 2022-05-09 | Head of Center of Excellence | 4 |
bcde | 2022-05-09 | 2099-12-31 | Head of Center of Excellence | 4 |
and after that use query to get final result:
select DimEmployeeId, JobPosition, login, min(ValidFrom), max(ValidTo)
from employeeContracts
group by DimEmployeeId, JobPosition, no, login
Example Data Scheme
CREATE TABLE employeeContracts (
login text,
ValidFrom datetime,
ValidTo datetime,
JobPosition text
);
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2019-07-01', '2019-09-30', 'Project Manager');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2020-01-09', '2020-06-16', 'Head of Center of Excellence');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2020-06-17', '2020-07-31', 'Team Leader');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2020-08-01', '2021-03-31', ' Team Leader');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2021-04-01', '2021-06-30', ' Team Leader');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2021-07-01', '2021-07-31', ' Team Leader');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2021-08-01', '2021-12-31', ' Head of Center of Excellence');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2022-01-01', ' 2022-05-09', 'Head of Center of Excellence');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2022-02-01', '2022-05-09', 'Head of Center of Excellence');
INSERT INTO employeeContracts (login, ValidFrom, ValidTo, JobPosition)
VALUES ('bcde', '2022-05-09', '2099-12-31', 'Head of Center of Excellence');
This can be tested Here
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这听起来像是一个“差距和岛屿”问题。接近它的一种方法是将排名识别并分配给每个“岛”(或每个工作人员的日期范围)。
卓越 应用您的最小/最大逻辑,按排名编号进行分组:
结果:
db<>>> gt; gt; a href
This sounds like a "Gaps and Islands" problem. One way of approaching it is to identify and assign rankings to each "island" (or date ranges for each JobPosition).
Then apply your min/max logic, grouping by the ranking number:
Results:
db<>fiddle here