提问人:smriti mishra 提问时间:8/25/2023 最后编辑:Jan Doggensmriti mishra 更新时间:8/28/2023 访问量:53
如何识别在分配的当前值之前分配的值?
How to identify the value which was assigned before the present value that is assigned?
问:
客户表中存在多个客户历史行,并且已分配一个 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 |
答:
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
上一个:将 Case 语句创建为函数
下一个:处理基于函数的场景时出现问题
评论