我正在寻找一种方法来选择一组最近的记录。我有两张桌子:
表 1:
+---------+-------------+--------+--------+------------------+
| user_id | category_id | field1 | field2 | date |
+---------+-------------+--------+--------+------------------+
| 19 | 2 | 3 | 3 | 22/01/2021 15:00 |
| 19 | 1 | 1 | 3 | 22/01/2021 15:00 |
| 19 | 5 | 2 | 2 | 22/01/2021 15:00 |
| 18 | 1 | 2 | 2 | 22/01/2021 15:04 |
| 18 | 31 | 4 | 1 | 22/01/2021 15:04 |
| 18 | 40 | 3 | 1 | 22/01/2021 15:04 |
| 19 | 40 | 2 | 2 | 22/01/2021 15:21 |
| 19 | 166 | 1 | 1 | 22/01/2021 15:21 |
| 19 | 40 | 5 | 5 | 22/01/2021 16:23 |
| 19 | 166 | 6 | 6 | 22/01/2021 16:23 |
+---------+-------------+--------+--------+------------------+
表 2:
+---------+-------------+
| user_id | category_id |
+---------+-------------+
| 18 | 1 |
| 18 | 31 |
| 18 | 40 |
| 19 | 40 |
| 19 | 166 |
+---------+-------------+
我想从 Table1 中为 Table2 中存在的特定 user_id
和 category_id
选择最近的行。例如,如果 user_id=19
,我想获得以下记录组:
+---------+-------------+--------+--------+------------------+
| user_id | category_id | field1 | field2 | date |
+---------+-------------+--------+--------+------------------+
| 19 | 40 | 5 | 5 | 22/01/2021 16:23 |
| 19 | 166 | 6 | 6 | 22/01/2021 16:23 |
+---------+-------------+--------+--------+------------------+
我最接近的查询是有效的 fiddle,但这给了我 Table1 的最后四条记录。
答案 0 :(得分:3)
这似乎对所有用户都做了你想要的:
SELECT T1.*
FROM Table1 t1
WHERE T1.DATE = (SELECT MAX(tt1.DATE)
FROM Table1 tt1 JOIN
Table2 tt2
ON TT1.user_id = Tt2.user_id AND
tt1.category_id = tt2.category_id
WHERE tt1.user_id = t1.user_id AND
tt1.category_id = t1.category_id
)
您可以在外部查询中为特定用户添加过滤器。
答案 1 :(得分:2)
我认为最有效的方法是在 sql 中使用 Ties :
SELECT TOP 1 WITH TIES t1.*
FROM Table1 t1 join Table2 t2 on t1.user_id=t2.user_id and t1.category_id=t2.category_id
ORDER BY ROW_NUMBER() OVER(PARTITION BY t1.[user_id],t1.[category_id] ORDER BY t1.date desc)