首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从一组行而不是所有行中提取列的最旧值?

如何从一组行而不是所有行中提取列的最旧值?
EN

Stack Overflow用户
提问于 2022-04-29 12:53:17
回答 1查看 94关注 0票数 2

我有一张表格,格式如下

代码语言:javascript
复制
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:

代码语言:javascript
复制
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,并且彼此紧跟在一起,因此序列。

代码语言:javascript
复制
John|9    |2011-5-30|
John|9    |2012-7-30|

案例2:

代码语言:javascript
复制
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行)

代码语言:javascript
复制
John|9    |2022-1-1 |

案例3:

代码语言:javascript
复制
    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的最新一组行:

代码语言:javascript
复制
    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 |
EN

回答 1

Stack Overflow用户

发布于 2022-04-29 20:36:27

这是一个空隙&岛屿问题有一点曲折。你可以:

代码语言:javascript
复制
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

结果(为测试目的修改数据):

代码语言:javascript
复制
 name   min_date   
 ------ ---------- 
 Alice  2019-03-01 
 John   2016-11-03 

请参见在db<>fiddle上运行示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72058295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档