客户表中的客户存在多个历史行,并且已分配一个 ID,该 ID 可能已随时间而更改
姓名 | 身份证 | 日期 |
---|---|---|
阿布舍克 | 1 | 2023年8月23日 |
阿布舍克 | 1 | 2023年3月8日 |
阿布舍克 | 2 | 2023年6月17日 |
阿布舍克 | 3 | 2022年9月10日 |
西玛 | A | 2023年8月21日 |
西玛 | B | 2022年7月6日 |
西玛 | C | 2020年5月22日 |
数据中最新的id
姓名 | 身份证 | 日期 | ** |
---|---|---|---|
阿布舍克 | 1 | 2023年8月23日 | |
西玛 | A | 2023年8月21日 |
所需的输出(在这些最新的 ID 值之前分配的 ID 值)是
姓名 | 身份证 | 日期 | ** |
---|---|---|---|
阿布舍克 | 2 | 2023年6月17日 | |
西玛 | B | 2022年7月6日 |
我尝试了滞后函数,但在 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 |
西玛 | A | B |
如果这是 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;
输出:
姓名 | 身份证 | 最大(日期) | rn |
---|---|---|---|
阿布舍克 | 2 | 2023-06-17 | 2 |
西玛 | B | 2022-06-07 | 2 |
select *
from (
select *,row_number() over (partition by name order by date desc) as rn
from (
select name,id,max(date) as date
from TABLENAME q
group by name, id ) x ) z
where z.rn = 2