更改标志时第一条记录的SQL查询

时间:2017-01-11 04:34:18

标签: sql sql-server tsql

请考虑下表

<a href="PhotoDatabase/PhotoFileName.jpg">PhotoName</a>

获得低于结果的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

感谢。

2 个答案:

答案 0 :(得分: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 ID=@ID
ELSE
INSERT INTO @T3 SELECT FLAG,DATE FROM @T1 WHERE ID=@ID
END
SET @OLD=@FLAG
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

答案 1 :(得分: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,......?在那种情况下会得到什么结果?