按要求写查询语句

MySQL脚本

-- ----------------------------
-- Table structure for contract
-- ----------------------------
DROP TABLE IF EXISTS `contract`;
CREATE TABLE `contract`  (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `contract_code` varchar(50)  NOT NULL COMMENT '合同编号',
  `contract_name` varchar(50)  NOT NULL COMMENT '合同名称',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8  COMMENT = '合同' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of contract
-- ----------------------------
INSERT INTO `contract` VALUES (1, 'HT001', 'HT001-1', '2024-05-15 00:00:00');
INSERT INTO `contract` VALUES (2, 'HT002', 'HT002-1', '2024-05-15 00:00:00');
INSERT INTO `contract` VALUES (3, 'HT003', 'HT003-1', '2024-05-15 00:00:00');
INSERT INTO `contract` VALUES (4, 'HT001', 'HT001-2', '2024-05-16 08:55:49');
INSERT INTO `contract` VALUES (5, 'HT002', 'HT002-2', '2024-05-16 08:55:49');
INSERT INTO `contract` VALUES (6, 'HT003', 'HT003-2', '2024-05-16 08:55:49');
INSERT INTO `contract` VALUES (7, 'HT004', 'HT004-1', '2024-05-15 08:55:49');
mysql> SELECT * FROM contract;
+----+---------------+---------------+---------------------+
| id | contract_code | contract_name | create_time         |
+----+---------------+---------------+---------------------+
|  1 | HT001         | HT001-1       | 2024-05-15 00:00:00 |
|  2 | HT002         | HT002-1       | 2024-05-15 00:00:00 |
|  3 | HT003         | HT003-1       | 2024-05-15 00:00:00 |
|  4 | HT001         | HT001-2       | 2024-05-16 08:55:49 |
|  5 | HT002         | HT002-2       | 2024-05-16 08:55:49 |
|  6 | HT003         | HT003-2       | 2024-05-16 08:55:49 |
|  7 | HT004         | HT004-1       | 2024-05-15 08:55:49 |
+----+---------------+---------------+---------------------+
7 rows in set (0.00 sec)

mysql>

要求:

  1. 合同编号有重复的
  2. 根据创建时间(create_time)倒序 获取最新的合同名称、合同编号

预期结果:

mysql>
+---------------+---------------+
| contract_code | contract_name |
+---------------+---------------+
| HT001         | HT001-2       |
| HT002         | HT002-2       |
| HT003         | HT003-2       |
+---------------+---------------+
3 rows in set (0.00 sec)

mysql>

思路分析

  1. CTE(公共表表达式):使用 WITH RankedContracts AS (...) 创建一个公共表表达式,命名为 ranked_contracts
  2. ROW_NUMBER():在 SELECT 中使用 ROW_NUMBER() OVER (PARTITION BY contract_code ORDER BY create_time DESC) 为每个合同编号分配一个序号。 PARTITION BY contract_code 表示对每个合同编号进行分组
  3. 主查询:在主查询中,从 ranked_contracts 中选择合同编号、合同名称和创建时间,只保留 rn > 1 的记录,即合同编号有重复的的记录
  4. ORDER BY:最后,按创建时间倒序排列结果

参考答案

WITH ranked_contracts AS (
    SELECT 
        contract_code,
        contract_name,
        create_time,
        ROW_NUMBER() OVER (PARTITION BY contract_code ORDER BY create_time ASC) AS rn
    FROM 
        contract
)
SELECT contract_code, contract_name 
FROM ranked_contracts 
WHERE rn > 1
ORDER BY create_time DESC;
  • 运行结果如下
mysql> WITH ranked_contracts AS (
    ->     SELECT 
    ->         contract_code,
    ->         contract_name,
    ->         create_time,
    ->         ROW_NUMBER() OVER (PARTITION BY contract_code ORDER BY create_time ASC) AS rn
    ->     FROM 
    ->         contract
    -> )
    -> SELECT contract_code, contract_name 
    -> FROM ranked_contracts 
    -> WHERE rn > 1
    -> ORDER BY create_time DESC;
+---------------+---------------+
| contract_code | contract_name |
+---------------+---------------+
| HT001         | HT001-2       |
| HT002         | HT002-2       |
| HT003         | HT003-2       |
+---------------+---------------+
3 rows in set (0.00 sec)

mysql>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要学就学灰太狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值