如何识别在分配的当前值之前分配的值?

How to identify the value which was assigned before the present value that is assigned?

提问人:smriti mishra 提问时间:8/25/2023 最后编辑:Jan Doggensmriti mishra 更新时间:8/28/2023 访问量:53

问:

客户表中存在多个客户历史行,并且已分配一个 ID,该 ID 可能已随时间推移而更改

名字 编号 日期
阿比舍克 1 23-08-2023
阿比舍克 1 03-08-2023
阿比舍克 2 17-06-2023
阿比舍克 3 09-10-2022
西玛 一个 21-08-2023
西玛 B 07-06-2022
西玛 C 22-05-2020

数据中的最新 ID

名字 编号 日期 **
阿比舍克 1 23-08-2023
西玛 一个 21-08-2023

所需的输出(在这些最新值之前分配的 ID 值)是

名字 编号 日期 **
阿比舍克 2 17-06-2023
西玛 B 07-06-2022

我尝试了滞后功能,但是在 id 有多个更改的响应中,所需的输出不是第二个最新的 id,而是涉及不同的 id

例如:

select * from (
select Name,`id,lag(id,1) over (partition by Name order by date) as
lag_id from customer_history)
名字 编号 lag_id
阿比舍克 1 2
阿比舍克 2 3
西玛 一个 B
sql mysql 函数 hive sql-function

评论


答:

1赞 user1191247 8/25/2023 #1

如果这是 MySQL,则日期格式应为 YYYY-mm-dd。

以下查询使用 GROUP BY 删除重复的 ID 和 ROW_NUMBER():

WITH t1 AS (
    SELECT Name, ID, MAX(Date), ROW_NUMBER() OVER (PARTITION BY Name ORDER BY MAX(Date) DESC) AS rn
    FROM customer_history
    GROUP BY Name, ID
)
SELECT * FROM t1 WHERE rn = 2;

输出:

名字 编号 MAX(日期) 注册护士
阿比舍克 2 2023-06-17 2
西玛 B 2022-06-07 2

这是一个 db<>fiddle

0赞 FanoFN 8/28/2023 #2

如果您的日期确实是这样格式的,那么您需要添加一个函数来重新格式化日期,然后才能运行上一个建议的答案。因此:STR_TO_DATE()

WITH t1 AS (
  SELECT Name, ID, MAX(STR_TO_DATE(Date, '%d-%m-%Y')), 
        ROW_NUMBER() 
         OVER (PARTITION BY Name ORDER BY MAX(STR_TO_DATE(Date, '%d-%m-%Y')) DESC) AS rn
  FROM customer_history
  GROUP BY Name, ID
)
SELECT * FROM t1 WHERE rn = 2

https://dbfiddle.uk/VdWN5TNq