You could add a CTE first where you add a row_nmber to get the order of the dates and then select them
update
I added a solution without GROUP BY and further window functions at the end
CREATE TABLE t
(ID_sale int, sales_person int, sale_date date)
;
INSERT INTO t
(ID_sale, sales_person, sale_date)
VALUES
(1, 50, '2022-10-19'),
(2, 43, '2022-9-17'),
(3, 50, '2022-3-15'),
(4, 43, '2022-2-13'),
(5, 50, '2022-1-22'),
(6, 10, '2022-2-5'),
(7, 12, '2022-1-7')
;
Records: 7 Duplicates: 0 Warnings: 0
WITH CTE AS
( select
ID_sale, sales_person, sale_date,
ROW_NUMBER() OVER(PARTITION BY sales_person ORDER BY sale_date DESC) rn
from t)
SELECT
MIN(ID_sale), sales_person,
(SELECT sale_date FROM CTE WHERE sales_person = c1.sales_person and rn = 1) recent_sale ,
COALESCE(
(SELECT sale_date FROM CTE WHERE sales_person = c1.sales_person and rn = 2),
(SELECT sale_date FROM CTE WHERE sales_person = c1.sales_person and rn = 1)) last_sale
FROM CTE c1
GROUP BY sales_person
ORDER BY recent_sale DESC;
MIN(ID_sale) |
sales_person |
recent_sale |
last_sale |
1 |
50 |
2022-10-19 |
2022-03-15 |
2 |
43 |
2022-09-17 |
2022-02-13 |
6 |
10 |
2022-02-05 |
2022-02-05 |
7 |
12 |
2022-01-07 |
2022-01-07 |
WITH CTE AS
( select
ID_sale, sales_person, sale_date,
ROW_NUMBER() OVER(PARTITION BY sales_person ORDER BY sale_date DESC) rn
from t)
SELECT
ID_sale, sales_person,
Sale_date recent_sale ,
COALESCE(
(SELECT sale_date FROM CTE WHERE sales_person = c1.sales_person and rn = 2),
Sale_date) last_sale
FROM CTE c1
WHERE rn = 1
ORDER BY recent_sale DESC;
ID_sale |
sales_person |
recent_sale |
last_sale |
1 |
50 |
2022-10-19 |
2022-03-15 |
2 |
43 |
2022-09-17 |
2022-02-13 |
6 |
10 |
2022-02-05 |
2022-02-05 |
7 |
12 |
2022-01-07 |
2022-01-07 |
fiddle