Sql 前1名与条件相关

Sql 前1名与条件相关,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要从ks_data_operacji列中获取每个sp_编号的最新值。它是有效的,但问题是结果应该依赖于列ksd_ksub_id。如果ksd_ksub_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_i

我需要从ks_data_operacji列中获取每个sp_编号的最新值。它是有效的,但问题是结果应该依赖于列ksd_ksub_id。如果ksd_ksub_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)

您可以尝试使用
CTE
通过
row\u number
窗口功能生成行号,然后通过
ksd\u ksub\u 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 |

;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 |

我想您可以通过将条件添加到订单中:

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
                           )

也就是说,将“第二行”放在第一行。

您能提供一些示例数据和预期结果吗?我需要获得2013-10-03的值,当我创建临时表时,它可以工作。我不知道为什么它在我的生产数据库中不起作用。样本数据最好作为+。请将您的问题包括在内,您当前的尝试和您想要的结果。关于更多细节,@Arkadiusz您对样本数据的预期结果是什么?最新日期是2015-11-17,但ksd_ksub_id=2,因此我的预期结果是2013-10-03。