Топ 1 с галстуками с условием - PullRequest
0 голосов
/ 05 октября 2018

Мне нужно получить последнее значение из столбца ks_data_operacji для каждого sp_numer.Это работает, но проблема в том, что результат должен зависеть от столбца ksd_ksksub_id.Если ksd_ksksub_id = 2, то я хотел бы получить второе последнее значение.Вот мой код:

select top 1 with ties
sp_numer,
CAST(ks_data_operacji as date) as data_ostatniej_wplaty

from sprawa
join ksiegowanie_dekret on ksd_rb_id=sp_rb_id
join ksiegowanie on ksd_ks_id=ks_id
where sp_numer=102079 and ksd_ksksub_id<>2
order by ROW_NUMBER() over (partition by sp_numer order by   
ks_data_operacji desc)

Пример данных:

create table ##temp ( sp_numer varchar(10), ks_data_operacji date,    
ksd_ksksub_id int ) 

insert into ##temp 
values (102079,'2013-07-24',5), 
(102079,'2013-10-03',6)
,(102079,'2015-11-17',2)

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я думаю, вы можете просто добавить условие к order by:

order by row_number() over (partition by sp_numer
                            order by (case when ksd_ksksub_id = 2 then 1 else 2 end),
                                     ks_data_operacji desc
                           )

То есть сделать «вторую» строку «первой».

0 голосов
/ 05 октября 2018

Вы можете попытаться использовать CTE сделать номер строки с помощью ROW_NUMBER оконной функции, затем self-join с помощью ksd_ksksub_id и rn = 1

create table temp ( sp_numer varchar(10), ks_data_operacji date,    
ksd_ksksub_id int ) ;

insert into temp 
values (102079,'2013-07-24',5), 
(102079,'2013-10-03',6)
,(102079,'2015-11-17',2);

Запрос 1 :

;WITH CTE AS(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY sp_numer order by ks_data_operacji desc) rn
    FROM temp 
)
SELECT t2.*
FROM CTE t1 
JOIN CTE t2 on t1.rn = 1 and t1.ksd_ksksub_id = t2.rn

Результаты :

| sp_numer | ks_data_operacji | ksd_ksksub_id | rn |
|----------|------------------|---------------|----|
|   102079 |       2013-10-03 |             6 |  2 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...