I have a Parent object that has many Versions.
CREATE TABLE version (
id int,
item_id int,
logged_at datetime,
parent_id int
);
CREATE TABLE parent (
id int
);
INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (1, 1, "2021-12-01 20:00:00", 1);
INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (2, 1, "2021-12-01 20:20:00", 1);
INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (3, 1, "2021-12-01 21:40:00", 1);
INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (4, 2, "2021-12-01 21:40:00", 1);
INSERT INTO version (id, item_id, logged_at, parent_id)
VALUES (5, 2, "2021-12-01 20:20:00", 1);
INSERT INTO parent (id)
VALUES (1);
As you can see, each Version belongs to different Items. Where the only thing differentiating them is the .item_id they belong to and the .logged_at attribute.
My objective is to find the lowest .item_id Version with the latest .logged_at.
Thus the desired result should in this example be :
VALUES (3, 1, "2021-12-01 21:40:00", 1);
I understand row_number() partitions can acquire the first child, but I'm having difficulty understanding how to do a secondary faceted search.
Any help or pointers would be greatly appreciated. Thank you!
CodePudding user response:
you can try it like this.
SELECT *, ROW_NUMBER() OVER (PARTITION BY item_id ORDER BY logged_at DESC) row_num
FROM VERSION
ORDER BY logged_at DESC, row_num, item_id
LIMIT 1
Sort by item_id according to logged_in time by PARTITION BY syntax.
Then, for items with the same item_id, the ranking is determined according to the logged_in.
From that table, order by logged_in desc is the primary to know the most recently logged in user, and order by row_num, item_id are secondary to select the lowest item_id among users who logged in at the same time.
