MYSQL查询,用于仅选择具有过期日期的最新数据行集

MYSQL查询,用于仅选择具有过期日期的最新数据行集,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,从下面的示例数据集中,我试图仅获取已过期保单的客户的最新保单信息(自动、家庭和生活) +-----------+-----------+-------------+-----------------+ | record_id | client_id | policy_type | expiration_date | +-----------+-----------+-------------+-----------------+ | 001 | 001 | auto

从下面的示例数据集中,我试图仅获取已过期保单的客户的最新保单信息(自动、家庭和生活)

+-----------+-----------+-------------+-----------------+
| record_id | client_id | policy_type | expiration_date |
+-----------+-----------+-------------+-----------------+
|       001 |       001 | auto        | 2019-05-06      |
|       002 |       001 | home        | 2019-05-06      |
|       003 |       001 | life        | 2019-05-06      |
|       004 |       002 | auto        | 2019-07-22      |
|       005 |       002 | home        | 2019-07-22      |
|       006 |       002 | life        | 2019-07-22      |
|       007 |       001 | auto        | 2020-01-20      |
|       008 |       001 | home        | 2020-01-20      |
|       009 |       001 | life        | 2020-01-20      |
|       010 |       003 | auto        | 2019-07-23      |
|       011 |       003 | home        | 2019-07-23      |
|       012 |       003 | life        | 2019-07-23      |
|       013 |       004 | auto        | 2019-01-30      |
|       014 |       004 | home        | 2019-01-30      |
|       015 |       004 | life        | 2019-01-30      |
|       016 |       002 | auto        | 2020-04-11      |
|       017 |       002 | home        | 2020-04-11      |
|       018 |       002 | life        | 2020-04-11      |
|       019 |       003 | auto        | 2020-06-17      |
|       020 |       003 | home        | 2020-06-17      |
|       021 |       003 | life        | 2020-06-17      |
|       022 |       004 | auto        | 2020-02-01      |
|       023 |       004 | home        | 2020-02-01      |
|       024 |       004 | life        | 2020-02-01      |
+-----------+-----------+-------------+-----------------+
如果有人能为我的查询语句提供帮助,我将不胜感激

谢谢,
Raffi

对于DBMS版本8+,您可以使用分析函数,例如
densite\u rank()

通过上述方法,分组是通过
partitionby
处理的,通过从分析函数返回
1
的值进行过滤后,通过
order By
子句导出的最新日期

对于所有版本(尤其是8之前的版本),可以使用以下语句

SELECT t1.record_id, t1.client_id, t1.policy_type, t1.expiration_date 
  FROM tab t1
  JOIN
      (
       SELECT max(expiration_date) AS expiration_date, policy_type 
         FROM tab
        GROUP BY client_id, policy_type
       ) t2
    ON t2.expiration_date=t1.expiration_date AND t2.policy_type = t1.policy_type;
考虑到您的注释告诉我们结果应该是针对每个客户机的,我在第一个查询的
分区依据
列表和第二个查询的
分组依据
列表中添加了
client\u id


您的DBMS版本是什么?您好,谢谢您的回复。我需要在mysql中执行此操作。@Raffi。是 啊所以这两个查询都应该在MySQL中工作+-----------+-----------+-------------+-----------------+
|记录|身份|客户|身份|政策|类型|到期|
+------------------+------------------+-+
| 19 | 3 |自动| 2020-06-17 |
| 20 | 3 |家庭| 2020-06-17 |
|+-----------+-----------+-------------+-----------------+
样本数据集所需的查询结果将是record_id 7,8,9,22,23,24。此外,每个客户端可能有多个过期的策略。对于策略已过期(过期日期早于今天)的客户端,只应选择最近过期的策略集(自动、家庭、生活)。谢谢,RaffiI特意询问了8+还是8-,因为分析函数不适用于8-。因此,您的版本似乎是8-@Raffi
SELECT t1.record_id, t1.client_id, t1.policy_type, t1.expiration_date 
  FROM tab t1
  JOIN
      (
       SELECT max(expiration_date) AS expiration_date, policy_type 
         FROM tab
        GROUP BY client_id, policy_type
       ) t2
    ON t2.expiration_date=t1.expiration_date AND t2.policy_type = t1.policy_type;