SQL Server - 比较两行(如果匹配),而不是选择行X.

时间:2017-01-28 12:26:10

标签: sql-server

我有两个看起来像这样的表:

event_ap

Event   a_nr    tnr    date         timestamp    knr   maschnr
PAN        123     2203   2017-01-23   21600        11    x222
PAN        132     2203   2017-01-22   21600        22    x222
PAB        123     2203   2017-01-23   28523        11    x222
PAN        555     2203   2017-01-23   14023        33    x222
PAN        555     2201   2017-01-23   21235        44    x222
PAB        222     2202   2017-01-23   21245        44    x222
PAN        666     2202   2017-01-28   35000        44    x222
PAB        666     2202   2017-01-28   35000        44    x222

pers_stm

name  knr
Test1 11
Test2 22
Test3 33
Test4 44

所以我需要的是每个ID(knr)的最后一条记录。我对此的查询看起来像这样

select *  
From ( 
      select * 
      from ( select *
                   , row_number() over (partition  by knr 
                                        order by date desc, timestamp desc) as RN 
             from event_ap 
            ) X 
      where RN = 1 
     ) Y 
join pers_stm p on p.knr = Y.knr

但这有一个问题。

正如您在Table" event_ap"的示例中所见。 (最后两条记录)有完全相同的数据(包括相同的时间戳)的记录唯一差异事件标记

所以基于我目前的查询我需要什么:

  • (获取上表查询已完成的表event_ap(日期,时间戳)的最后一条记录
  • 如果两条记录具有相同的日期,时间戳和ID(knr),则p 使用event-Tag" PAN" 作为查询结果

谢谢!

2 个答案:

答案 0 :(得分:0)

casedate 首次排序之后,将以下timestamp表达式添加到行号分区

case when Event = 'PAN' then 0 else 1 end

如果两个或多个记录具有相同的日期/时间戳,则会强制PAN个事件记录到顶部。如果日期/时间戳没有关系,则此case表达式将不起作用,并且在 表示绑定但不存在PAN记录的情况下,也不会产生影响。

select *
From
(
    select *
    from
    (
        select *,
               row_number() over
               (partition by knr order by date desc,
                                          timestamp desc,
                case when Event = 'PAN' then 0 else 1 end) as RN
        from event_ap
    ) X
    where RN = 1
) Y
join pers_stm p
    on p.knr = Y.knr

答案 1 :(得分:0)

尝试将Event desc添加到order by的{​​{1}}条款中,使其成为:

over (...)

这假设你只有'PAB'和' PAN'在您的“事件”列中。如果你还有其他任何东西,那就是PAN' PAN'在降序文本排序中,蒂姆的回答是要走的路。