我有一个存储报告的SQL表。每行都有一个customer_id和building_id,当我有customer_id时,我需要为每个具有该customer_id的建筑物选择最新的行(最近的create_date)。
report_id customer_id building_id create_date
1 1 4 1553561789
2 2 5 1553561958
3 1 4 1553561999
4 2 5 1553562108
5 3 7 1553562755
6 3 8 1553570000
我希望得到报告ID的3、4、5和6。
我该如何查询?我尝试了一些子选择并进行了分组,但没有使它起作用。
答案 0 :(得分:0)
如果您使用的是MySQL 8+,那么ROW_NUMBER
是一个很好的方法:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id, building_id
ORDER BY create_date DESC) rn
FROM yourTable
)
SELECT
report_id,
customer_id,
building_id,
create_date
FROM cte
WHERE rn = 1;
如果在最近的创建日期可能有不止一个客户/建筑物对,并且您想捕获所有关系,则将ROW_NUMBER
替换为RANK
,并使用相同的查询。 / p>
答案 1 :(得分:0)
另一种变化:
SELECT a.*
FROM myTable a
WHERE a.create_date = (SELECT MAX(create_date)
FROM myTable b
WHERE b.customer_id = a.customer_id
AND b.building_id = a.building_id)
可以尝试搜索“有效的过期记录”以查看各种方法。