排名第一的条件

时间:2018-10-05 07:44:59

标签: sql sql-server tsql

我需要从ks_data_operacji列中获取每个sp_numer的最新值。它可以工作,但问题是结果应取决于ksd_ksksub_id列。如果ksd_ksksub_id = 2,那么我想获取第二个最新值。 这是我的代码:

O(n^p)

样本数据:

s1

2 个答案:

答案 0 :(得分:2)

您可以尝试通过CTE窗口函数使用ROW_NUMBER生成行号,然后通过self-joinksd_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

Results

| sp_numer | ks_data_operacji | ksd_ksksub_id | rn |
|----------|------------------|---------------|----|
|   102079 |       2013-10-03 |             6 |  2 |

答案 1 :(得分:0)

我认为您可以将条件添加到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
                           )

也就是说,将“第二”行设置为“第一”。