2017-05-29 49 views
1

我有一個批准表,其中有一個請求者,驗證者和批准者。有時,在一定的要求沒有多核查員:獲取指定列爲空的第一個行組

RequestNo | UserName | Action | Seq | ActionDate 
R001  | JohnD | Requestor | 1 | 01/01/2017 
R001  | SamS  | Verifier | 2 | NULL 
R001  | TrishL | Verifier | 3 | NULL 
R001  | GeorgeP | Verifier | 4 | NULL 
R001  | JackF | Approver | 5 | NULL 

我需要的是在ActionDate空值,以獲得第一行動集團(請求者,覈實,審批)。我需要在第一個Action組下面顯示UserNames和Action,並使用null ActionDate。在這種情況下,它應該是SamS,TrishL和GeorgeP。多謝你們!

+0

難道thers的喜歡'R001另一行| BlaB |驗證者| 6 | NULL'? ActionDate是否只有一行? – dnoeth

+0

嗨,dnoeth,那是不可能的。批准者將始終是請求編號 –

+0

中的最後一行如果驗證者組中第一個空值之後的行之一具有非空的actionDate,該怎麼辦?你是否仍然需要在驗證者組中顯示所有行? –

回答

1

像這樣的查詢應該給你你想要的信息:

Select UserName, Action 
From ActionGroups 
Where Action in (
    Select top 1 Action 
    from ActionGroups 
    Where ActionDate Is Null 
    Order by Action 
) 

在這種情況下,你被它返回的第一個動作(按字母順序排序),有一個空ActionDate子查詢過濾。

+0

謝謝!我在內部和外部查詢中都放置了WHERE RequestNo ='R001''語句,以實現所需的結果。這是很好的SQL代碼?因爲如果我將在SELECT內部放置WHERE語句,它將多次重複驗證程序。如果我將WHERE語句放在外部SELECT中,它只會顯示批准者 –

+1

@HarambeAttackHelicopter真棒。如果這有助於您解決問題,請考慮接受答案 –

1

這有點難看,但應該讓你得到需要的東西。您首先將具有相同操作的連續行分配給組。然後獲得每個組的maxmin日期。然後檢查最大和最小日期是否爲空,並選擇第一個這樣的組。

select requestno,username,action,seq,actiondate 
from (select t.* 
     ,min(case when maxdate is null and mindate is null then grp end) over(partition by requestno) as first_grp 
     from (select t.* 
      ,max(actiondate) over(partition by requestno,grp) as maxdate 
      ,min(actiondate) over(partition by requestno,grp) as mindate 
      from (select t.*,sum(col) over(partition by requestno order by seq) as grp 
        from (select t.* 
         ,case when lag(action) over(partition by requestno order by seq)=action then 0 else 1 end as col 
         from t 
         ) t 
       ) t 
      )t 
    ) t 
where first_grp=grp 
+0

當組中只有NULL時,您不必同時檢查min和max :) – dnoeth

1
Try using the below query. 

declare @tbl table 
(
ReqNO varchar(10), 
Username varchar(10), 
[Action] varchar(20), 
Seq bit, 
[Date] datetime null 
) 

insert into @tbl values ('R001','JohnD','Requestor',1,'01/01/2017') 
insert into @tbl values ('R001','SamS','Verifier',2,null) 
insert into @tbl values ('R001','TrishL','Verifier',3,null) 
insert into @tbl values ('R001','GeorgeP','Verifier',4,null) 
insert into @tbl values ('R001','JackF','Approver',5,null) 

--select * from @tbl 

select t.Username from @tbl t where t.Action in(
select d.Action from @tbl d where d.Date is null 
--and ReqNO='R001' 
group by (d.Action) having COUNT(d.Action)>1) 
相關問題