![](/img/trans.png)
[英]SQL Server : select values from multiple rows when one row met condition
[英]Set values to all subsequent rows when a condition is met at current row
以下是基本員工表。 emp_id、manager_hierarchy、month_end_date 的組合對於表來說是唯一的。
CREATE TABLE employee_table_base
(
emp_id INTEGER NOT NULL,
manager_hierarchy INTEGER NOT NULL,
month_end_date TIMESTAMP NOT NULL,
assisted_flag VARCHAR(1) NOT NULL
);
INSERT INTO employee_table_base(emp_id, manager_hierarchy, month_end_date, assisted_flag)
VALUES
(12345, 1, '2021-10-31', 'N' ),
(12345, 2, '2021-10-31', 'N' ),
(12345, 3, '2021-10-31', 'N' ),
(12345, 1, '2021-11-30', 'Y' ),
(12345, 2, '2021-11-30', 'Y' ),
(12345, 3, '2021-11-30', 'Y' ),
(12345, 1, '2021-12-31', 'Y' ),
(12345, 2, '2021-12-31', 'Y' ),
(12345, 3, '2021-12-31', 'Y' ),
(12345, 1, '2022-01-31', 'Y' ),
(12345, 2, '2022-01-31', 'Y' ),
(12345, 3, '2022-01-31', 'Y' ),
(12345, 1, '2022-02-02', 'Y' ),
(12345, 2, '2022-02-02', 'Y' ),
(12345, 1, '2022-03-31', 'Y' ),
(12345, 2, '2022-03-31', 'Y' ),
(12345, 1, '2022-04-30', 'Y' ),
(12345, 2, '2022-04-30', 'Y' ),
(12345, 1, '2022-05-31', 'Y' ),
(12345, 2, '2022-05-31', 'Y' ),
(12345, 3, '2022-05-31', 'Y' ),
(12345, 1, '2022-06-30', 'N' ),
(12345, 2, '2022-06-30', 'N' ),
(12345, 1, '2022-07-31', 'Y' ),
(12345, 2, '2022-07-31', 'Y' );
emp_id | manager_hierarchy | 月末日期 | 輔助標志 |
---|---|---|---|
12345 | 1 | 2021-10-31 00:00:00 | ñ |
12345 | 2 | 2021-10-31 00:00:00 | ñ |
12345 | 3 | 2021-10-31 00:00:00 | ñ |
12345 | 1 | 2021-11-30 00:00:00 | 是 |
12345 | 2 | 2021-11-30 00:00:00 | 是 |
12345 | 3 | 2021-11-30 00:00:00 | 是 |
12345 | 1 | 2021-12-31 00:00:00 | 是 |
12345 | 2 | 2021-12-31 00:00:00 | 是 |
12345 | 3 | 2021-12-31 00:00:00 | 是 |
12345 | 1 | 2022-01-31 00:00:00 | 是 |
12345 | 2 | 2022-01-31 00:00:00 | 是 |
12345 | 3 | 2022-01-31 00:00:00 | 是 |
12345 | 1 | 2022-02-02 00:00:00 | 是 |
12345 | 2 | 2022-02-02 00:00:00 | 是 |
12345 | 1 | 2022-03-31 00:00:00 | 是 |
12345 | 2 | 2022-03-31 00:00:00 | 是 |
12345 | 1 | 2022-04-30 00:00:00 | 是 |
12345 | 2 | 2022-04-30 00:00:00 | 是 |
12345 | 1 | 2022-05-31 00:00:00 | 是 |
12345 | 2 | 2022-05-31 00:00:00 | 是 |
12345 | 3 | 2022-05-31 00:00:00 | 是 |
12345 | 1 | 2022-06-30 00:00:00 | ñ |
12345 | 2 | 2022-06-30 00:00:00 | ñ |
12345 | 1 | 2022-07-31 00:00:00 | 是 |
12345 | 2 | 2022-07-31 00:00:00 | 是 |
所需的 output:
drop table if exists employee_table_ouput;
CREATE temp TABLE employee_table_ouput
(
emp_id INTEGER NOT NULL,
manager_hierarchy INTEGER NOT NULL,
month_end_date TIMESTAMP NOT NULL,
assisted_flag VARCHAR(1) NOT NULL,
assisted_baseline INTEGER NOT NULL
);
INSERT INTO employee_table_ouput(emp_id, manager_hierarchy, month_end_date, assisted_flag, assisted_baseline)
VALUES
(12345, 1, '2021-10-31', 'N', 0 ),
(12345, 2, '2021-10-31', 'N', 0 ),
(12345, 3, '2021-10-31', 'N', 0 ),
(12345, 1, '2021-11-30', 'Y', 0 ),
(12345, 2, '2021-11-30', 'Y', 0 ),
(12345, 3, '2021-11-30', 'Y', 0 ),
(12345, 1, '2021-12-31', 'Y', 1 ),
(12345, 2, '2021-12-31', 'Y', 1 ),
(12345, 3, '2021-12-31', 'Y', 1 ),
(12345, 1, '2022-01-31', 'Y', 1 ),
(12345, 2, '2022-01-31', 'Y', 1 ),
(12345, 3, '2022-01-31', 'Y', 1 ),
(12345, 1, '2022-02-02', 'Y', 1 ),
(12345, 2, '2022-02-02', 'Y', 1 ),
(12345, 1, '2022-03-31', 'Y', 1 ),
(12345, 2, '2022-03-31', 'Y', 1 ),
(12345, 1, '2022-04-30', 'Y', 1 ),
(12345, 2, '2022-04-30', 'Y', 1 ),
(12345, 1, '2022-05-31', 'Y', 1 ),
(12345, 2, '2022-05-31', 'Y', 1 ),
(12345, 3, '2022-05-31', 'Y', 1 ),
(12345, 1, '2022-06-30', 'N', 0 ),
(12345, 2, '2022-06-30', 'N', 0 ),
(12345, 1, '2022-07-31', 'Y', 1 ),
(12345, 2, '2022-07-31', 'Y', 1 );
emp_id | manager_hierarchy | 月末日期 | 輔助標志 | 輔助基線 |
---|---|---|---|---|
12345 | 1 | 2021-10-31 00:00:00 | ñ | 0 |
12345 | 2 | 2021-10-31 00:00:00 | ñ | 0 |
12345 | 3 | 2021-10-31 00:00:00 | ñ | 0 |
12345 | 1 | 2021-11-30 00:00:00 | 是 | 0 |
12345 | 2 | 2021-11-30 00:00:00 | 是 | 0 |
12345 | 3 | 2021-11-30 00:00:00 | 是 | 0 |
12345 | 1 | 2021-12-31 00:00:00 | 是 | 1 |
12345 | 2 | 2021-12-31 00:00:00 | 是 | 1 |
12345 | 3 | 2021-12-31 00:00:00 | 是 | 1 |
12345 | 1 | 2022-01-31 00:00:00 | 是 | 1 |
12345 | 2 | 2022-01-31 00:00:00 | 是 | 1 |
12345 | 3 | 2022-01-31 00:00:00 | 是 | 1 |
12345 | 1 | 2022-02-02 00:00:00 | 是 | 1 |
12345 | 2 | 2022-02-02 00:00:00 | 是 | 1 |
12345 | 1 | 2022-03-31 00:00:00 | 是 | 1 |
12345 | 2 | 2022-03-31 00:00:00 | 是 | 1 |
12345 | 1 | 2022-04-30 00:00:00 | 是 | 1 |
12345 | 2 | 2022-04-30 00:00:00 | 是 | 1 |
12345 | 1 | 2022-05-31 00:00:00 | 是 | 1 |
12345 | 2 | 2022-05-31 00:00:00 | 是 | 1 |
12345 | 3 | 2022-05-31 00:00:00 | 是 | 1 |
12345 | 1 | 2022-06-30 00:00:00 | ñ | 0 |
12345 | 2 | 2022-06-30 00:00:00 | ñ | 0 |
12345 | 1 | 2022-07-31 00:00:00 | 是 | 1 |
12345 | 2 | 2022-07-31 00:00:00 | 是 | 1 |
基線值總是在上一年的最后一天計算
case when month_end_date = date_trunc('year', current_date) - interval '1 day') and assisted_flag = 'Y' then 1 else 0 end as assisted_baseline
是否可以在 assisted_flag = 'Y' 時將當前年份的所有行設置為 1,並在 assisted_flag = 'N' 時設置為 0。 尋找可以在沒有自連接的情況下完成的解決方案。
將您的案例表達式修改如下:
select emp_id, manager_hierarchy, month_end_date, assisted_flag,
case
when (
month_end_date = date_trunc('year', current_date) - interval '1 day'
or
date_trunc('year', current_date) = date_trunc('year', month_end_date)
)
and assisted_flag = 'Y'
then 1 else 0
end as assisted_baseline
from employee_table_base
見演示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.