为每个符合这些参数的客户选择最新行

时间:2019-03-26 01:22:07

标签: mysql sql

我有一个存储报告的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。

我该如何查询?我尝试了一些子选择并进行了分组,但没有使它起作用。

2 个答案:

答案 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)

可以尝试搜索“有效的过期记录”以查看各种方法。