请考虑下表
<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
感谢。
答案 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
或更新版(支持LEAD
和LAG
)。将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,......?在那种情况下会得到什么结果?