2016-12-28 3 views
0

У меня есть таблица со следующей структуройДобавить дополнительное значение флага запроса SQL на основе последовательного дня логики

Date   Holiday Flag  
12/23/2016  -1    
12/24/2016  -1    
12/25/2016  1    
12/26/2016  1    
12/27/2016  -1    

Я хочу, чтобы добавить дополнительный флаг на основе полученного из двух столбцов, указанных выше, такие

Date   Holiday Flag  Previous Flag 
12/23/2016  -1    -1 
12/24/2016  -1    -1 
12/25/2016  1    -1 
12/26/2016  1    1 
12/27/2016  -1    -1 

в принципе, в том случае, если есть праздник на двух последовательных дней (12/25/2016 и 12/26/2016), я хочу «предыдущий флаг», чтобы отразить, что на второй день (12/26/2016) в качестве 1

Я использую SQL Server 2008 для формирования запроса, но, похоже, не знаю логики.

Каков наилучший способ подойти к этой ситуации? Заранее благодарю вас за помощь, я новичок в программировании. Любая помощь будет оценена по достоинству.

+0

Если вы используете SQL Server 2012 или выше, функции LEAD() и LAG() выполнялись для таких упражнений, как этот. –

+0

@ RossBush, к сожалению, я ограничена использованием SQL Server 2008. Любые идеи о том, как подойти к этой ситуации? – kage77

ответ

1

С помощью КТР и row_number()

Declare @YourTable table (Date date, [Holiday Flag] int) 
Insert Into @YourTable values 
('12/23/2016',-1), 
('12/24/2016',-1),    
('12/25/2016', 1),    
('12/26/2016', 1),    
('12/27/2016',-1) 

;with cte as (
Select * 
     ,RN = Row_Number() over (Order By Date) 
From @YourTable 
) 
Select A.Date 
     ,A.[Holiday Flag] 
     ,[Previous Flag] = IsNull(B.[Holiday Flag],A.[Holiday Flag]) 
From cte A 
Left Join cte B on (B.RN=A.RN-1) 
Order By A.Date 

Возвращает

enter image description here

Не уверен, что я согласен с желаемыми результатами. Я показываю предыдущий флаг 12/27 как 1

1

Это может сработать.

DECLARE @T TABLE (Date DATETIME,HolidayFlag INT) 
INSERT INTO @T SELECT '12/23/2016',-1 
INSERT INTO @T SELECT '12/24/2016',-1 
INSERT INTO @T SELECT '12/25/2016',1 
INSERT INTO @T SELECT '12/26/2016',1 
INSERT INTO @T SELECT '12/27/2016',-1 

SELECT 
    This.Date, 
    This.HolidayFlag, 
    LastHolidayFlag=CASE WHEN Last.Date IS NULL THEN -1 ELSE Last.HolidayFlag END 
FROM 
(
    SELECT Date,HolidayFlag,RowNumber=ROW_NUMBER() OVER (ORDER BY Date) FROM @T 
)AS This 
LEFT OUTER JOIN 
(
    SELECT Date,HolidayFlag, RowNumber=ROW_NUMBER() OVER (ORDER BY Date) FROM @T 
)AS Last ON Last.RowNumber=This.RowNumber-1 
0

Не слишком сложный. Попробуй это.

Declare @Table table (Date date, [Holiday Flag] int) 
Insert Into @Table values 
('12/23/2016',-1), 
('12/24/2016',-1),    
('12/25/2016',1),    
('12/26/2016',1),    
('12/27/2016',-1) 

Select A.Date 
     ,A.[Holiday Flag] 
     ,[Previous Flag] = IsNull(B.[Holiday Flag],A.[Holiday Flag]) 
From @Table A 
Left Join @Table B on (DateAdd(day,-1 , A.Date)=B.Date) 
Order By A.Date 
0

Поскольку у вас есть последовательные даты, ROW_NUMBER() является излишним. Попробуйте следующее:

Declare @MyTbl table (
    Dt date PRIMARY KEY, 
    HolidayFlag int 
    ) 

Insert Into @MyTbl 
values 
    ('12/23/2016',-1), 
    ('12/24/2016',-1),    
    ('12/25/2016', 1),    
    ('12/26/2016', 1),    
    ('12/27/2016',-1) 

SELECT t1.Dt as [Date], 
    t1.HolidayFlag as [Holiday Flag], 
    CASE 
     WHEN t1.HolidayFlag = 1 
      THEN IsNull(t2.HolidayFlag, -1) 
     ELSE -1 
    END as [Previous Flag] 
FROM @MyTbl t1 
LEFT JOIN @MyTbl t2 
    ON t2.dt = dateadd(day, -1, t1.dt) 
Смежные вопросы