我正在try 使用以下查询提供最近的日期:

select id, amount, yearmonthday
from ( 
select 
id,
amount,
yearmonthday,
row_number() OVER (PARTITION BY id ORDER BY try(date_parse(yearmonthday, '%Y-%m-%d'))) as row_num 
from "db_raw"."table" ) ranked
where row_num = 1 and id = 1

但每次我运行查询时,都会得到不同的结果,而不是上次的日期

第一次 run ,带来了我想要的:

id amount yearmonthday
1 10000 20231213

如果我再次参选,会给我带来另一个结果:

id amount yearmonthday
1 9000 20230327

推荐答案

首先,您需要按降序进行排序,以获得最新的日期(假设日期是过go 的日期):

row_number() OVER (PARTITION BY id 
     ORDER BY try(date_parse(yearmonthday, '%Y-%m-%d')) desc) as row_num

默认排序顺序为升序.

还要注意:

  • 你可以有几行相同的日期每个分区的数据,在这种情况下,你会得到一个随机的一个之间的"重复"
  • try(...)将接受导致null的解析错误,因此请确保它实际解析的日期,否则您将不会对输出进行实际排序.在SELECT结果上加上try(date_parse(yearmonthday, '%Y-%m-%d'),看看它是否不为NULL(也可以用select count(*) from ... where try(date_parse(yearmonthday, '%Y-%m-%d') is null计算所有无法解析的行数)

UPD

第二个注意事项是正确的-您使用错误的格式解析日期,yearmonthday没有分隔符,因此删除它们:

row_number() OVER (PARTITION BY id 
     ORDER BY try(date_parse(yearmonthday, '%Y%m%d')) desc) as row_num

Sql相关问答推荐

Postgresql在加入时显示重复的行

如何退回当年的所有参赛作品?""

不同表达方式时的大小写

如果多行科目有一行在指定的日期范围内,如何 Select 该科目在该日期之前的所有行?

将结果从一列转换为两行或更多

Oracle分层查询-两条路径在末尾合并为一条

属于(日期)范围类型及其交集的总权重​

SQL到Snowflake-转换嵌套的SELECT(值

在UNION查询中查找MIN

使用左外部联接更正列中第+1行的值时重复

Select 最频繁的值以及分组依据

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

SQL 中的第一个值和倒数第二个值

避免在SQL中使用具有相同条件的多个子查询

REGEXP_SUBSTR使用方法

如何创建一个递归计数器来查找一个元素有多少父级和子级?

SQL 按 id 运行总计并受条件限制(在窗口上)

我需要遍历权重值表并确定每个权重是否有效

如何根据 Amazon Athena 中的多个列值删除重复行?

按 15 分钟递增计数分组,包括 0 计数