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;