我想首先添加行,如果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 :(得分: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, '');