SQL для получения последней записи, последней записи, где Tag = 1 и предыдущей записи последней записи, где Tag = 1 - PullRequest
0 голосов
/ 05 июля 2019

У меня есть таблица, в которой хранятся несколько записей для определенного идентификатора, как в примере записи ниже

Образцы записей

ID  Note Date      Tag
2   A2  05-07-2019  1
3   A3  05-07-2019  0
2   A4  08-07-2019  0
2   A5  09-07-2019  1
3   A6  10-07-2019  0
3   A7  11-07-2019  0
3   A8  12-07-2019  0
3   A9  13-07-2019  0
2   A10 14-07-2019  0
3   A11 15-07-2019  1
3   A12 16-07-2019  1
2   A13 17-07-2019  0

Теперь я хочу

  1. получить последнюю запись определенного идентификатора

  2. Получить последнюю запись определенного идентификатора, где tag = 1

  3. и предыдущая запись точки № 2

Результат

Column1 Column2         Column3                      Column4
(ID)   (LatestFUNote)  (PreviousFUNoteofColumn4)    (Latest FU Note Where Tag=1)
2       A13             A4                           A5
3       A12             A11                          A12

1 Ответ

2 голосов
/ 05 июля 2019
with cte as
(
select
    ID 
,   Note 
,   Date  
,   Tag
,lag(note) over (order by [date] ) prevnote
, row_number() over (partition by [ID] order by [date] desc)  rn1
, row_number() over (partition by [ID],Tag order by [date] desc)  rn2
from 
(values
(2,   'A2',  '2019-07-05',  1)
,(3,   'A3',  '2019-07-05',  0)
,(2,   'A4',  '2019-07-08',  0)
,(2,   'A5',  '2019-07-09',  1)
,(3,   'A6',  '2019-07-10',  0)
,(3,   'A7',  '2019-07-11',  0)
,(3,   'A8',  '2019-07-12',  0)
,(3,   'A9',  '2019-07-13',  0)
,(2,   'A10', '2019-07-14',  0)
,(3,   'A11', '2019-07-15',  1)
,(3,   'A12', '2019-07-16',  1)
,(2,   'A13', '2019-07-17',  0)
) a(ID , Note ,   Date  ,         Tag)
)
select
[ID]
,max(iif(rn1=1,Note,null)) LatestFUNote    
,max(iif(rn2=1 and [tag]=1,prevnote,null)) PreviousFUNoteofColumn4    
,max(iif(rn2=1 and [tag]=1,Note,null)) [Latest FU Note Where Tag=1]  
from CTE group by [ID]
...