sql - 如何获取每组的最小日期行的值等于最大日期中的值?

标签 sql postgresql

我正在尝试获取查询的行。其中每组 id 的最小 end_date 中的行 value1、value2 等于最大 end_date。

我当前的查询只获取查询结果中最大end_date的行value1、value2:

select a.id, a.end_date, a.value1, a.value2
from table1 as a
inner join (
    select id, max(end_date) as end_date
    from database1
    group by id
) as b 
on a.id = b.id and a.end_date = b.end_date
order by id, end_date

此结果获取最新记录,但我希望获取 min(end_date = max(end_date) 中 value1 和 value2 的行,按 id 分组。

这是一个示例查询,详细说明了我想要获取的内容:

<表类=“s-表”> <标题> id 结束日期 值1 值2 <正文> AAPL 02/12/22 2 1 AAPL 02/13/22 2 1 AAPL 02/14/22 3 2 AAPL 02/15/22 3 2 MSFT 03/01/22 2 5 MSFT 03/02/22 4 5 MSFT 03/03/22 4 5 MSFT 03/04/22 4 5

根据之前的查询,我需要获取的查询如下:

<表类=“s-表”> <标题> id 结束日期 值1 值2 <正文> AAPL 02/14/22 3 2 MSFT 03/02/22 4 5

因此,我再次需要 min(end_date) = max(end_date) 中 value1、value2 的行,并按 id 分组。

最佳答案

您可以使用 row_number() 来完成

select id, end_date, value1, value2
from (
   select t1.*, row_number() over(partition by t1.id order by t1.end_date) rn
   from tbl t1
   join (
     select id, end_date, value1, value2
     from (
       select t.*, row_number() over(partition by id order by end_date desc) rn
       from tbl t
     ) t
     where rn = 1
   ) t2 on t1.id = t2.id and t1.value1 = t2.value1 and t1.value2 = t2.value2 
) t
where rn = 1

db<>fiddle

关于sql - 如何获取每组的最小日期行的值等于最大日期中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71378184/

相关文章:

mysql - 更新表列,然后使用前者的更新值更新另一列。 MySQL/PostgreSQL 不同

sql - 如何在 Linux 中使用类似输出的表运行 Oracle 查询

用于计算每 n 行的平均值的 SQL 查询,步骤 1

python - 在 plpython3u 过程中导入 Python 包时出现 "Module not found"

sql - 如何将 name 列拆分为 PostgreSQL 中的 firstName 和 lastName 列?

SQL 每 n 分钟选择一行

mysql - 检查列上的计数

postgresql - 我如何使用 ssl 身份验证从 FluentNhibernate 连接到 postgres

mysql - 计算具有相同 WHERE 条件的多个列

windows - 没有 PgAdmin3 的 PostgreSQL win32/64 无窗口安装?