我想回傳下面列出的列,但希望它按 JobNumber 分組,并且只要它沒有跳過任何階段,就只回傳最大的 StageNum。
例如,我的表當前如下所示:
| ID | 階段 | 階段編號 | 日期 |
|---|---|---|---|
| 104 | 發布 | 10 | 2022-02-07 |
| 104 | 板坯 | 20 | 2022-02-18 |
| 104 | 框架 | 30 | 2022-03-07 |
| 104 | 機械學 | 42 | 2022-03-10 |
| 105 | 發布 | 10 | 2022-02-07 |
| 105 | 板坯 | 20 | 2022-02-18 |
| 106 | 發布 | 10 | 2022-02-07 |
| 106 | 板坯 | 20 | 2022-02-18 |
| 106 | 框架 | 30 | 2022-03-04 |
| 106 | 檐口 | 40 | 2022-03-08 |
結果應該如下所示,ID 104 回傳 StageNum 30 而不是 42,因為 StageNum 40 被跳過:
| ID | 階段 | 階段編號 | 日期 |
|---|---|---|---|
| 104 | 框架 | 30 | 2022-03-07 |
| 105 | 板坯 | 20 | 2022-02-18 |
| 106 | 檐口 | 40 | 2022-03-08 |
我可以通過按 ID 分組并選擇 MAX(StageNum) 回傳最高值,但不知道如何解釋跳過的階段。
uj5u.com熱心網友回復:
如果存在stages表
select * into stages
from(
values
('Released', 10),
('Slab', 20),
('Frame', 30),
('Mechanicals', 42),
('Cornice', 40)
) t(Stage, StageNum)
您可以將所需的職位與操作進行比較
select top(1) with ties ID, Stage, StageNum, Date
from (
select t.ID ,t.StageNum, t.Date, stn.Stage, stn.spos, row_number() over(partition by ID order by t.StageNum) tpos
from tbl t
join (
select StageNum, Stage, row_number() over(order by StageNum) spos
from stages
) stn on stn.StageNum = t.StageNum
) t
where tpos=spos
order by row_number() over(partition by ID order by StageNum desc)
uj5u.com熱心網友回復:
這是一種無需創建表來記錄階段的可能性。我們使用string_agg()然后檢查所有階段是否存在。我們可以在沒有 CTE 的情況下執行此操作,但我們必須string_agg每行運行多次。
create table c( ID int, Stage varchar(20), StageNum int, sDate Date); insert into c values (104,'Released',10,'2022-02-07'), (104,'Slab', 20,'2022-02-18'), (104,'Frame', 30,'2022-03-07'), (104,'Mechanicals',42,'2022-03-10'), (105,'Released', 10,'2022-02-07'), (105,'Slab', 20,'2022-02-18'), (106,'Released',10,'2022-02-07'), (106,'Slab', 20,'2022-02-18'), (106,'Frame', 30,'2022-03-04'), (106,'Cornice', 40,'2022-03-08');
select * from c;身份證 | 舞臺 | 階段編號 | 日期 --: | :------------ | --------: | :--------- 104 | 發布 | 10 | 2022-02-07 104 | 板坯 | 20 | 2022-02-18 104 | 框架 | 30 | 2022-03-07 104 | 機械 | 42 | 2022-03-10 105 | 發布 | 10 | 2022-02-07 105 | 板坯 | 20 | 2022-02-18 106 | 發布 | 10 | 2022-02-07 106 | 板坯 | 20 | 2022-02-18 106 | 框架 | 30 | 2022-03-04 106 | 檐口 | 40 | 2022-03-08
select id, string_agg(stageNUM,'-') from c group by id;
編號 | (無列名) --: | :--------------- 104 | 10-20-30-42 105 | 10-20 106 | 10-20-30-40
with stages as( select id, string_agg(stageNUM,'') s from c group by id ) select id, case when s = '1020304042' then 'Mechanicals' when left(s,8) = '10203040' then 'Cornice' when left(s,6) = '102030' then 'Frame' when left(s,4) = '1020' then 'Slab' when left(s,2) = '10' then 'Released' else 'unknown' end Stage from stages
id | Stage --: | :------ 104 | Frame 105 | Slab 106 | Cornice
db<>fiddle here
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/443786.html
