检索员工的第一次重新雇用和终止日期以及第二次重新雇用和终止日期
retrieving first rehire and terminated dates and second rehire and termination of employee
我想写一个 SQL 查询来获取员工的第一次重新雇用、终止日期和第二次重新雇用、终止日期,如果员工没有这些日期,那么 它将显示空白( null) in result. table 名称为 per_periods 并且日期开始列包含 hire/rehire 日期并且实际终止日期包含终止 dates.In 图像 1st&2nd 表示重新雇用日期和第 1 和第 2 任期意味着终止日期
有table个数据图片如下:
[在此处输入图片描述][1]
查询必须适用于所有记录。谁能指导我
如果您需要更多信息,请在评论框中发表评论。
[1]: https://i.stack.imgur.com/YSqKL.png
在 Oracle 中,从版本 12 开始,您可以使用 MATCH_RECOGNIZE
:
SELECT *
FROM table_name
MATCH_RECOGNIZE (
PARTITION BY person_id
ORDER BY date_start
MEASURES
first_rehire.date_start AS rehire1_start,
first_rehire.actual_termination_date AS rehire1_end,
second_rehire.date_start AS rehire2_start,
second_rehire.actual_termination_date AS rehire2_end
PATTERN (^ first_hire first_rehire? second_rehire?)
DEFINE first_hire AS 1 = 1
)
或者,在 Oracle 和 MySQL 中,您可以使用:
SELECT person_id,
rehire1_start,
rehire1_end,
rehire2_start,
rehire2_end
FROM (
SELECT person_id,
ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY date_start) AS rn,
LEAD(date_start, 1)
OVER (PARTITION BY person_id ORDER BY date_start) AS rehire1_start,
LEAD(actual_termination_date, 1)
OVER (PARTITION BY person_id ORDER BY date_start) AS rehire1_end,
LEAD(date_start, 2)
OVER (PARTITION BY person_id ORDER BY date_start) AS rehire2_start,
LEAD(actual_termination_date, 2)
OVER (PARTITION BY person_id ORDER BY date_start) AS rehire2_end
FROM table_name
) t
WHERE rn = 1;
其中,对于示例数据:
CREATE TABLE table_name (person_id, date_start, actual_termination_date) AS
SELECT 1, TIMESTAMP '1970-01-01 00:00:00 UTC', TIMESTAMP '1971-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 1, TIMESTAMP '1972-01-01 00:00:00 UTC', TIMESTAMP '1973-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 1, TIMESTAMP '1974-01-01 00:00:00 UTC', TIMESTAMP '1975-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 1, TIMESTAMP '1976-01-01 00:00:00 UTC', TIMESTAMP '1977-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 2, TIMESTAMP '1970-01-01 00:00:00 UTC', TIMESTAMP '1971-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 2, TIMESTAMP '1972-01-01 00:00:00 UTC', TIMESTAMP '1973-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 2, TIMESTAMP '1974-01-01 00:00:00 UTC', TIMESTAMP '1975-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 3, TIMESTAMP '1970-01-01 00:00:00 UTC', TIMESTAMP '1971-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 3, TIMESTAMP '1972-01-01 00:00:00 UTC', TIMESTAMP '1973-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 4, TIMESTAMP '1970-01-01 00:00:00 UTC', TIMESTAMP '1971-01-01 00:00:00 UTC' FROM DUAL;
双输出:
PERSON_ID
REHIRE1_START
REHIRE1_END
REHIRE2_START
REHIRE2_END
1
01-JAN-72 00.00.00.000000000 UTC
01-JAN-73 00.00.00.000000000 UTC
01-JAN-74 00.00.00.000000000 UTC
01-JAN-75 00.00.00.000000000 UTC
2
01-JAN-72 00.00.00.000000000 UTC
01-JAN-73 00.00.00.000000000 UTC
01-JAN-74 00.00.00.000000000 UTC
01-JAN-75 00.00.00.000000000 UTC
3
01-JAN-72 00.00.00.000000000 UTC
01-JAN-73 00.00.00.000000000 UTC
null
null
4
null
null
null
null
db<>fiddle here
我想写一个 SQL 查询来获取员工的第一次重新雇用、终止日期和第二次重新雇用、终止日期,如果员工没有这些日期,那么 它将显示空白( null) in result. table 名称为 per_periods 并且日期开始列包含 hire/rehire 日期并且实际终止日期包含终止 dates.In 图像 1st&2nd 表示重新雇用日期和第 1 和第 2 任期意味着终止日期
有table个数据图片如下: [在此处输入图片描述][1]
查询必须适用于所有记录。谁能指导我
如果您需要更多信息,请在评论框中发表评论。 [1]: https://i.stack.imgur.com/YSqKL.png
在 Oracle 中,从版本 12 开始,您可以使用 MATCH_RECOGNIZE
:
SELECT *
FROM table_name
MATCH_RECOGNIZE (
PARTITION BY person_id
ORDER BY date_start
MEASURES
first_rehire.date_start AS rehire1_start,
first_rehire.actual_termination_date AS rehire1_end,
second_rehire.date_start AS rehire2_start,
second_rehire.actual_termination_date AS rehire2_end
PATTERN (^ first_hire first_rehire? second_rehire?)
DEFINE first_hire AS 1 = 1
)
或者,在 Oracle 和 MySQL 中,您可以使用:
SELECT person_id,
rehire1_start,
rehire1_end,
rehire2_start,
rehire2_end
FROM (
SELECT person_id,
ROW_NUMBER() OVER (PARTITION BY person_id ORDER BY date_start) AS rn,
LEAD(date_start, 1)
OVER (PARTITION BY person_id ORDER BY date_start) AS rehire1_start,
LEAD(actual_termination_date, 1)
OVER (PARTITION BY person_id ORDER BY date_start) AS rehire1_end,
LEAD(date_start, 2)
OVER (PARTITION BY person_id ORDER BY date_start) AS rehire2_start,
LEAD(actual_termination_date, 2)
OVER (PARTITION BY person_id ORDER BY date_start) AS rehire2_end
FROM table_name
) t
WHERE rn = 1;
其中,对于示例数据:
CREATE TABLE table_name (person_id, date_start, actual_termination_date) AS
SELECT 1, TIMESTAMP '1970-01-01 00:00:00 UTC', TIMESTAMP '1971-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 1, TIMESTAMP '1972-01-01 00:00:00 UTC', TIMESTAMP '1973-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 1, TIMESTAMP '1974-01-01 00:00:00 UTC', TIMESTAMP '1975-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 1, TIMESTAMP '1976-01-01 00:00:00 UTC', TIMESTAMP '1977-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 2, TIMESTAMP '1970-01-01 00:00:00 UTC', TIMESTAMP '1971-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 2, TIMESTAMP '1972-01-01 00:00:00 UTC', TIMESTAMP '1973-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 2, TIMESTAMP '1974-01-01 00:00:00 UTC', TIMESTAMP '1975-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 3, TIMESTAMP '1970-01-01 00:00:00 UTC', TIMESTAMP '1971-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 3, TIMESTAMP '1972-01-01 00:00:00 UTC', TIMESTAMP '1973-01-01 00:00:00 UTC' FROM DUAL UNION ALL
SELECT 4, TIMESTAMP '1970-01-01 00:00:00 UTC', TIMESTAMP '1971-01-01 00:00:00 UTC' FROM DUAL;
双输出:
PERSON_ID REHIRE1_START REHIRE1_END REHIRE2_START REHIRE2_END 1 01-JAN-72 00.00.00.000000000 UTC 01-JAN-73 00.00.00.000000000 UTC 01-JAN-74 00.00.00.000000000 UTC 01-JAN-75 00.00.00.000000000 UTC 2 01-JAN-72 00.00.00.000000000 UTC 01-JAN-73 00.00.00.000000000 UTC 01-JAN-74 00.00.00.000000000 UTC 01-JAN-75 00.00.00.000000000 UTC 3 01-JAN-72 00.00.00.000000000 UTC 01-JAN-73 00.00.00.000000000 UTC null null 4 null null null null
db<>fiddle here