我需要使用日期列確定 x 列和 y 列中每個團隊花費的時間。為了做到這一點,我正在研究 x 列的反向填充和 y 列的正向填充,以便我可以計算每個團隊的開始時間和結束時間之間的差異。
X 列必須向后填充到同一數字內的前一個值,注意:它不應該應用于另一個數字。
Y 列必須向前填充,直到同一數字內的下一個值,注意:它不應該應用于另一個數字。
在向前填充和向后填充表中的資料時需要幫助。
這就是資料現在的樣子。
運行查詢后資料的外觀應該是 - X 列向后和 Y 向前
| 數字 | 日期 | Sl_NO | 列_X | 列_Y | Column_X_Backward | Column_Y_Forward |
|---|---|---|---|---|---|---|
| 1 | 44563 | 1 | 空值 | 空值 | 一個 | 空值 |
| 1 | 44563 | 2 | 一個 | 乙 | 一個 | 乙 |
| 1 | 44563 | 3 | 空值 | 空值 | C | 乙 |
| 1 | 44563 | 4 | 空值 | 空值 | C | 乙 |
| 1 | 44563 | 5 | 空值 | 空值 | C | 乙 |
| 1 | 44563 | 6 | 空值 | 空值 | C | 乙 |
| 1 | 44563 | 7 | C | D | C | D |
| 1 | 44563 | 8 | 空值 | 空值 | 乙 | D |
| 1 | 44563 | 9 | 乙 | F | 乙 | F |
| 1 | 44563 | 10 | 空值 | 空值 | 空值 | F |
| 1 | 44563 | 11 | 空值 | 空值 | 空值 | F |
| 1 | 44563 | 12 | 空值 | 空值 | 空值 | F |
| 2 | 44563 | 1 | 空值 | 空值 | 一個 | 空值 |
| 2 | 44563 | 2 | 一個 | 乙 | 一個 | 乙 |
| 2 | 44563 | 3 | 空值 | 空值 | C | 乙 |
| 2 | 44563 | 4 | 空值 | 空值 | C | 乙 |
| 2 | 44563 | 5 | C | D | C | D |
| 2 | 44563 | 6 | 空值 | 空值 | 乙 | D |
| 2 | 44563 | 7 | 乙 | 乙 | 乙 | 乙 |
| 2 | 44563 | 8 | 空值 | 空值 | 乙 | 乙 |
| 2 | 44563 | 9 | 空值 | 空值 | 乙 | 乙 |
| 2 | 44563 | 10 | 乙 | 一個 | 乙 | 一個 |
| 2 | 44563 | 11 | 空值 | 空值 | 空值 | 一個 |
| 2 | 44563 | 12 | 空值 | 空值 | 空值 | 一個 |
這里 X 列必須回填到前一個值,并且它應該在相同的數字內,而 Y 列必須向前填充到相同數字內的下一個值。
希望有人能夠在相同的情況下幫助我。
uj5u.com熱心網友回復:
您可以使用標量子查詢來完成。不幸的是,只有 Azur 版本的 Sql Server 支持功能IGNORE NULLS選項first_value()。
select t1.*
, coalesce(Column_X,
(select top(1) t2.Column_X
from mytable t2
where t2.Number = t1.Number and t2.Column_X is not null and t2.Sl_NO > t1.Sl_NO order by Sl_NO)) x2
, coalesce(Column_Y,
(select top(1) t2.Column_Y
from mytable t2
where t2.Number = t1.Number and t2.Column_X is not null and t2.Sl_NO < t1.Sl_NO order by Sl_NO desc)) y2
from mytable t1
uj5u.com熱心網友回復:
這是由lptr作為評論發布的。我將其發布為社區 wiki 答案以保留它,以防再次洗掉評論。
在這里,他們使用派生表來執行視窗聚合,這些聚合執行“累積”計數。然后他們使用該派生表來獲取MAX值,這些值再次被視窗化。
create table t(Number int, Date int, Sl_NO int, Column_X char(1), Column_Y char(1)) insert into t(Number, Date, Sl_No, Column_X, Column_Y) values (1, 44563, 1, NULL, NULL), (1, 44563, 2, 'A', 'B'), (1, 44563, 3, NULL, NULL), (1, 44563, 4, NULL, NULL), (1, 44563, 5, NULL, NULL), (1, 44563, 6, NULL, NULL), (1, 44563, 7, 'C', 'D'), (1, 44563, 8, NULL, NULL), (1, 44563, 9, 'E', 'F'), (1, 44563, 10, NULL, NULL), (1, 44563, 11, NULL, NULL), (1, 44563, 12, NULL, NULL), (2, 44563, 1, NULL, NULL), (2, 44563, 2, 'A', 'B'), (2, 44563, 3, NULL, NULL), (2, 44563, 4, NULL, NULL), (2, 44563, 5, 'C', 'D'), (2, 44563, 6, NULL, NULL), (2, 44563, 7, 'E', 'B'), (2, 44563, 8, NULL, NULL); select Number, Date, Sl_No, Column_X, max(Column_X) over(partition by Number, Date, cntColumn_X) as Column_X_Backward, Column_Y, max(Column_Y) over(partition by Number, Date, cntColumn_Y) as Column_Y_Forward from ( select *, count(Column_X) over(partition by Number, Date order by Sl_NO rows between unbounded preceding and 1 preceding) as cntColumn_X, count(Column_Y) over(partition by Number, Date order by Sl_NO) as cntColumn_Y from t ) as tdb<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/407736.html
標籤:
下一篇:使用SQL過濾日期
