[英]Get the first occurrence by date in SQL Server
我在SQL Server中有如下表:
DECLARE @ProposalTemp AS TABLE (Flag1 BIT, Flag2 BIT, Eff_From DATE)
INSERT INTO @ProposalTemp VALUES
(0, 0, '2019-03-01'),
(1, 0, '2019-03-01') ,
(0, 0, '2019-03-03') ,
(1, 1, '2019-03-05') ,
(1, 0, '2019-03-07') ,
(1, 1, '2019-03-09');
示例:從表05 / Mar / 2019起,表1中的Flag1為“ 1”。 從2019年3月9日起,Flag2為“ 1”。
我想獲取日期,當更改為active(1)且兩列(flag1,flag2)都未更改為“ 0”時
期望的輸出是
Flag1_Efff_Date Flag2_Efff_Date '2019-03-05' '2019-03-09'
這是另一個例子
INSERT INTO @ProposalTemp VALUES
(0, 0, '2019-03-01'),
(1, 0, '2019-03-01') ,
(0, 0, '2019-03-03') ,
(1, 1, '2019-03-05') ,
(1, 1, '2019-03-07') ,
(1, 1, '2019-03-09');
和期望的輸出將是
Flag1_Efff_Date Flag2_Efff_Date
'2019-03-05' '2019-03-05'
我已經嘗試了一點..仍然不知道如何編寫此邏輯。
SELECT
Flag1, Flag2, Eff_From
FROM
(SELECT
Flag1, Flag2, Eff_From,
ROW_NUMBER() OVER (PARTITION BY Flag1, Flag2 ORDER BY Eff_From) rn
FROM
@ProposalTemp) t
WHERE
rn = 1
有任何想法嗎?
你可以試試這個。
GO
;with cte as (
select row_number() over (order by eff_from) as Slno, * from @ProposalTemp )
, ctflg1 as (
select * from cte where slno = (select max(slno)+1 from cte where Flag1=0))
, ctflg2 as (
select * from cte where slno = (select max(slno)+1 from cte where Flag2=0))
select Flag1, Flag2, Eff_From from ctflg1
union
select Flag1, Flag2, Eff_From from ctflg2
GO
首先找出標志1個人的價值和使用FLAG2 cte
然后用它根據自己的需要。
只是一個瘋狂的猜測,因為您沒有提供所需的邏輯。
根據描述和預期結果,看起來您想要第二個實例的標志為1
SELECT Flag1Date = max(case when Flag1 = 1 and r1 = 2 then Eff_From end),
Flag2Date = max(case when Flag2 = 1 and r2 = 2 then Eff_From end)
FROM
( SELECT Flag1,Flag2,Eff_From,
Row_number() OVER(Partition BY Flag1 ORDER BY Eff_From ) r1,
Row_number() OVER(Partition BY Flag2 ORDER BY Eff_From ) r2
FROM @ProposalTemp
) t
編輯:根據您更新的問題
; with cte as
(
SELECT Flag1,Flag2,Eff_From,
Row_number() OVER(ORDER BY Eff_From ) rn
FROM @ProposalTemp
),
f1 as
(
select min(Eff_From) as Flag1Date
from cte f1
where f1.Flag1 = 1
and not exists (select * from cte x where x.Flag1 <> 1 and x.rn > f1.rn)
),
f2 as
(
select min(Eff_From) as Flag2Date
from cte f2
where f2.Flag2 = 1
and not exists (select * from cte x where x.Flag2 <> 1 and x.rn > f2.rn)
)
select *
from f1 cross join f2
DECLARE @ProposalTemp AS TABLE (Flag1 BIT, Flag2 BIT, Eff_From DATE)
INSERT INTO @ProposalTemp VALUES
(0, 0, '2019-03-01'),
(1, 0, '2019-03-01') ,
(0, 0, '2019-03-03') ,
(1, 1, '2019-03-05') ,
(1, 0, '2019-03-07') ,
(1, 1, '2019-03-09');
; WITH CTE_flag1flow as
(
select lag(flag1,1,null) over(order by Eff_From desc) as nex, flag1 as curr, lead(flag1,1,null) over(order by Eff_From desc) as prev, Eff_From
FROM @ProposalTemp),
CTE_flag2flow as
(
select lag(flag2,1,null) over(order by Eff_From desc) as nex, flag2 as curr, lead(flag2,1,null) over(order by Eff_From desc) as prev, Eff_From
FROM @ProposalTemp)
select *
from
(SELECT max(Eff_from) AS Eff_Flag1
FROM CTE_flag1Flow
WHERE curr = 1 AND prev = 0 ) AS c1
CROSS JOIN
(SELECT max(Eff_from) AS Eff_Flag2
FROM CTE_flag2Flow
WHERE curr = 1 AND prev = 0 ) AS C2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.