我有一张表格,格式如下
Name|Token| Date |
---------------------
John|7 |2010-4-30|
John|7 |2011-4-30|
John|9 |2011-5-30|
John|9 |2012-7-30|
John|9 |2015-1-30|
John|7 |2016-10-1|
John|9 |2016-11-3|
John|9 |2018-1-1 |
John|7 |2021-9-9 |我试图将数据从这个表复制到一个新的表中,我需要从每个人都有标记9的最新行中找出最古老的日期。就像在这种情况下,我需要将2016-11-3作为输出。现在,对于所有令牌都是9的情况,我可以很容易地使用group by子句和min(date)并获得结果,但是在这种情况下,如果我使用group by子句和min(date),我会得到类似于john|9|2011-5-30|的结果,但这是不正确的,因为令牌7破坏了2016-10-1上的集合。
其他案件1:
Name|Token| Date |
---------------------
John|7 |2010-4-30|
John|7 |2011-4-30|
John|9 |2011-5-30|
John|9 |2012-7-30|回答=> 2011-5-30.因为第3行和第4行都有标记9,并且彼此紧跟在一起,因此序列。
John|9 |2011-5-30|
John|9 |2012-7-30|案例2:
Name|Token| Date |
---------------------
John|7 |2010-4-30|
John|7 |2011-4-30|
John|9 |2011-5-30|
John|9 |2012-7-30|
John|9 |2015-1-30|
John|7 |2016-10-1|
John|9 |2016-11-3|
John|9 |2018-1-1 |
John|7 |2021-9-9 |
John|9 |2022-1-1 |回答-> 2022-1-1,因为最近的一组行以9作为标记,并且彼此紧跟在一起(在本例中只有1行)
John|9 |2022-1-1 |案例3:
Name|Token| Date |
---------------------
John|9 |2010-4-30|
John|9 |2011-4-30|
John|9 |2011-5-30|
John|9 |2012-7-30|
John|9 |2015-1-30|
John|9 |2016-10-1|
John|9 |2016-11-3|
John|9 |2018-1-1 |
John|7 |2021-9-9 |回答->2010-4-30,下面是序列中带有令牌9的最新一组行:
John|9 |2010-4-30|
John|9 |2011-4-30|
John|9 |2011-5-30|
John|9 |2012-7-30|
John|9 |2015-1-30|
John|9 |2016-10-1|
John|9 |2016-11-3|
John|9 |2018-1-1 |发布于 2022-04-29 20:36:27
这是一个空隙&岛屿问题有一点曲折。你可以:
with
g as (
select *,
sum(inc) over(partition by name order by date) as grp
from (
select *,
case when token <> lag(token) over(partition by name order by date)
then 1 else 0 end as inc
from t
) x
)
select g.name, min(g.date) as min_date
from g
join (
select name, max(grp) as max_grp from g where token = 9 group by name
) m on m.name = g.name and m.max_grp = g.grp
group by g.name结果(为测试目的修改数据):
name min_date
------ ----------
Alice 2019-03-01
John 2016-11-03 请参见在db<>fiddle上运行示例。
https://stackoverflow.com/questions/72058295
复制相似问题