我有一个表,其中包含如下数据:

ID NAME DATE ORDER
15 MICHELLE 2023-01-01 2
15 MICHELLE 2023-01-04 3
15 MITCH 2023-01-15 7

(这是我的表数据中针对特定id的一个小示例)

我想要一个返回ID的表,以及在特定时间点的值/它更改为什么

例如,我希望我的表看起来像

ID NAME FROM_DATE TO_DATE
15 MICHELLE 2023-01-01 2023-01-15
15 MITCH 2023-01-15 2023-03-10

其中,对于给定id的最后一个值,其to_date将是当前日期.

我已经做了

SELECT ID, 
       LAG(NAME) OVER (PARTITION BY ID ORDER BY ORDER) AS NAME,
       LAG(DATE) OVER (PARTITION BY ID, ORDER BY ORDER) AS FROM_DATE, 
       DATE AS TO_DATE
FROM MY_TABLE

然而,这一切正在回归

ID NAME FROM_DATE TO_DATE
15 MICHELLE 2023-01-01 2023-01-04
15 MICHELLE 2023-01-04 2023-01-15

而不是仅仅把米歇尔放在一行,因为从2023-01-01到2023-01-15没有变化,我无法证明米歇尔的名字已经从米歇尔改为米奇,而且这种变化一直持续到今天(因为之后没有记录)

我有什么办法可以做到这一点吗?谢谢!

推荐答案

您可以对MIN(日期)合计使用销售线索窗口函数,如下所示:

select ID, NAME, min(DATE) as FROM_DATE
      ,lead(FROM_DATE, 1, current_date) 
         over (partition by ID order by FROM_DATE) as TO_DATE
from MY_TABLE
group by ID, NAME;

以下是一个独立的示例:

with MY_TABLE as
    (
    select 
    COLUMN1::int as "ID",
    COLUMN2::string as "NAME",
    COLUMN3::date as "DATE",
    COLUMN4::int as "ORDER"
    from (values
    ('15','MICHELLE','2023-01-01','2'),
    ('15','MICHELLE','2023-01-04','3'),
    ('15','MITCH','2023-01-15','7')
    )
)
select ID, NAME, min(DATE) as FROM_DATE, lead(FROM_DATE, 1, current_date) over (partition by ID order by FROM_DATE) as TO_DATE
from MY_TABLE
group by ID, NAME;

输出:

ID NAME FROM_DATE TO_DATE
15 MICHELLE 2023-01-01 2023-01-15
15 MITCH 2023-01-15 2023-03-10

Sql相关问答推荐

用相同值更新行

Postgres,使用iLike运算符从json数组中搜索的工作方式与从常规表中搜索不同

替换上一个或下一个值中的空值并添加其价格日期

在SQL中返回缺省值,即使查询不返回任何结果

每小时 Select 1行

Oracle PL/SQL:解决DBMS输出大小限制的问题

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

插入具有预期逻辑的查询以Forking 表

在 SQL Server 中合并两个 XML 列

确定小数中使用的精度位数

使用临时表判断记录是否存在 - 如果存在则执行相同的操作

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

如何在第二个 INSERT 中使用第一个 INSERT 自动生成的 ID

根据不同日期标准分配组的逻辑

SQL:无重复项的两个聚合函数

使用in和and运算符过滤记录的条件

T-SQL - 返回每条记录的最近雇佣日期

根据条件列出不同的值

如何跨行合并以删除 SQL 中的空值?

包含多行的 SQL 查询