2017-01-11 26 views
-3

请考虑下面的表SQL查询时,一个标志改变

Flag  Date 
-----  ------- 
N   01/01/2017 
N   03/01/2017 
N   04/01/2017 
Y   06/01/2017 
Y   09/01/2017 
N   12/01/2017 
N   14/01/2017 
Y   15/01/2017 
Y   16/01/2017 
Y   19/01/2017 
N   23/01/2017 

什么是SQL代码来获取下面产生

Flag1   Date1   Flag2  Date2 
--------  ----------  ---------  ---------- 
Y    06/01/2017  N   12/01/2017 
Y    15/01/2017  N   23/01/2017 

感谢。

+0

请写下评论,至少你为什么downvoted! – Bob

+1

什么是实际要求。我无法理解?你想要Y和N在不同的列或其他东西? –

+0

这样的东西可能是你要找的东西:'SELECT Flag1 ='Y',Date1 = MIN(T. [Date]),Flag2 ='N',Date2 = C. [Date] FROM myTable T CROSS APPLY (SELECT Date([Date])FROM myTable WHERE Flag ='N'AND [Date]> = T. [Date])C([Date])WHERE T.Flag ='Y'GROUP BY C. [Date]; ' – ZLK

回答

0

此查询将帮助你认为你使用SQL Server 2012或更高版本(支持LEADLAG)。更改date_column命名您的日期列

SELECT flag1, date1, flag2, date2 
FROM 
(
    SELECT flag flag1, 
     date_column date1, 
     LEAD(flag) OVER (ORDER BY date_column) flag2, 
     LEAD(date_column) OVER (ORDER BY date_column) date2 
    FROM 
    ( 
     SELECT flag, date_column, 
     CASE WHEN COALESCE(LAG(flag) OVER (ORDER BY date_column), 'NULL') <> flag THEN 1 ELSE 0 END search_col 
     FROM table_name 
    ) t 
    WHERE search_col = 1 
) 
WHERE flag1 = 'Y'; 

可以运行的每个子查询了解查询的逻辑。

最后,在你的评论你说there is 1 to n number of records which their flag field is N then this is followed by 0 to n number of records which their flag field is Y.在3N的情况下,然后0Y然后4N,你怎么知道它不是7N,不是2N然后0Y然后5N,....?这种情况下的结果是什么?

0

试试这个:

SET NOCOUNT ON 
DECLARE @T1 TABLE (FLAG CHAR(10),DATE CHAR(20),ID INT IDENTITY(1,1)) 
INSERT INTO @T1 VALUES ('N','01/01/2017'); 
INSERT INTO @T1 VALUES ('N','03/01/2017'); 
INSERT INTO @T1 VALUES ('N','04/01/2017'); 
INSERT INTO @T1 VALUES ('Y','06/01/2017'); 
INSERT INTO @T1 VALUES ('Y','09/01/2017'); 
INSERT INTO @T1 VALUES ('N','12/01/2017'); 
INSERT INTO @T1 VALUES ('N','14/01/2017'); 
INSERT INTO @T1 VALUES ('Y','15/01/2017'); 
INSERT INTO @T1 VALUES ('Y','16/01/2017'); 
INSERT INTO @T1 VALUES ('Y','19/01/2017'); 
INSERT INTO @T1 VALUES ('N','23/01/2017'); 

DECLARE @T2 TABLE (FLAG CHAR(10),DATE CHAR(20),ID INT IDENTITY(1,1)) 
DECLARE @T3 TABLE (FLAG CHAR(10),DATE CHAR(20),ID INT IDENTITY(1,1)) 
DECLARE @FLAG CHAR(10),@ID INT,@OLD CHAR(10) 

SET @OLD=(SELECT FLAG FROM @T1 WHERE ID=1) 

DECLARE C CURSOR FOR 
SELECT FLAG,ID FROM @T1 WHERE ID>1 
OPEN C 
FETCH NEXT FROM C INTO @FLAG,@ID 
WHILE @@FETCH_STATUS=0 
BEGIN 
IF(@OLD<>@FLAG) 
BEGIN 
IF @FLAG='Y' 
INSERT INTO @T2 SELECT FLAG,DATE FROM @T1 WHERE [email protected] 
ELSE 
INSERT INTO @T3 SELECT FLAG,DATE FROM @T1 WHERE [email protected] 
END 
SET @[email protected] 
FETCH NEXT FROM C INTO @FLAG,@ID 
END 
CLOSE C 
DEALLOCATE C 
SELECT A.FLAG,A.DATE,B.FLAG,B.DATE FROM @T2 A INNER JOIN @T3 B 
ON A.ID=B.ID