如何过滤掉相同的日志,只保留第一个日志,直到值发生变化?

时间:2017-08-24 05:58:55

标签: sql ranking

我想首先添加行,如果CODE与上一行相同(过滤掉最新添加的行)。代码可能不会只显示一次。因此,似乎我不能简单地使用Qualify rank() over(partition by ...order by ...)来获得结果。

以下是原始数据:

id  START_DATE  CODE
--- ---------- -----
 1  2008-02-03   A
 1  2010-04-22   A
 1  2013-01-29   C
 1  2013-12-22   C
 1  2016-05-25   B
 1  2017-07-13   A

以及我期待的最终结果:

id  START_DATE  CODE
--- ---------- -----
 1  2008-02-03   A
 1  2013-01-29   C
 1  2016-05-25   B
 1  2017-07-13   A

有没有办法用SQL获得结果?

2 个答案:

答案 0 :(得分:0)

根据您所在的服务器,您可以使用LAG()窗口函数来测试前一行是否具有相同的代码,如果是,则标记它并仅保留具有第一个日期的行。 / p>

您可以阅读有关LAG()窗口函数here的更多信息。我认为大多数支持它的服务器的语法都相当。

考虑以下脚本以获得所需的结果(SQL Server):

select
    id
    ,START_DATE
    ,CODE 
from 
(
select 
    id
    ,START_DATE
    ,CODE 
    ,CASE WHEN CODE = LAG(CODE) over (order by id, START_DATE asc) THEN 0 else 1 END as flag
from 
    YOURTABLE as T
) as T
where
    flag = 1

答案 1 :(得分:0)

我认为你可以使用这样的查询:

select 
    id, [START_DATE], CODE
from (
    select *
      --, lag(CODE) over (order by id, [START_DATE]) as prevCODE
      --  ^^^^ for non-supported languages use below code instead vvvv
        , (select top(1) tt.CODE -- if `top(1)` not supported may you need to add `limit 1` afyer order by
           from t tt 
           where tt.id = t.id and tt.[START_DATE] > t.[START_DATE] 
            order by tt.[START_DATE]
          ) prevCODE
    from t
    ) t1
where 
    CODE <> coalesce(prevCODE, '');

[SQL Server Fiddle Demo]
[MySQL Fiddle Demo]