2017-08-24 47 views
0

如果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结果呢?

+0

你至少应该让我们知道您使用的SQL数据库产品,因为各种SQL方言有所不同。 – Arminius

+2

为什么前两个'A'行是排序行和最后一个'A'行是分开的?这里定义了什么命令?你有另一个唯一的标识符列吗? –

+1

您正在使用哪个[DBMS](https://en.wikipedia.org/wiki/DBMS)? Postgres的?甲骨文? –

回答

0

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

您可以阅读更多关于LAG()窗口函数here。我认为对于支持它的大多数服务器来说,语法都是相当相似的。

考虑下面的脚本,让你期望的结果(SQL服务器):

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

这不是特定于SQL Server的。 Oracle,Postgres,DB2,Teradata,Informix,Vertica,Ingres,Firebird和Redshift也支持窗口功能。实际上,他们大多数支持滞后()SQL Server之前很久 –

+0

我只知道SQL Server和Teradata,因此我想放入免责声明,以防止任何人在任何其他地方无法使用的情况下“烦恼”,导致downvotes ;-) – ssn

+1

似乎LAG()函数在Teradata中不起作用,但我可以用“MAX(代码)覆盖(PARTITION BY ID ORDER START_DATE ROWS between 1 PRECEDING AND 1 PRECEDING)”来取代以前的值 – kirrame1100

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]

+0

在您的SQL Server小提琴中,您需要将您的“LEAD”中的顺序颠倒或使用“LAG”,因为您给他最新的结果而不是最老的(按照他的描述)。 – ssn

+0

@SteffenSylvestNielsen tnx;我的小姐理解;)。 –

相关问题