我有一个列id, cl_id, ratio, diff的表,我想 Select 最大值为ratio的观测值,按cl_id分组,但如果有相等的值,那么应该从相等值中 Select 最大值diff.

以下是Have个和Want个表格:

CREATE TABLE Have(
    id INT PRIMARY KEY,
    cl_id CHAR(1),
    ratio DECIMAL(5,4),
    diff INT
);

INSERT INTO Have(id, cl_id, ratio, diff) VALUES 
(122222, 'a', 1.3333, 2),
(123333, 'a', 1.3333, 5),
(124444, 'b', 1.25, 2),
(125555, 'b', 1.6667, 1);


CREATE TABLE Want(
    id INT PRIMARY KEY,
    cl_id CHAR(1),
    ratio DECIMAL(5,4),
    diff INT
);

INSERT INTO Want(id, cl_id, ratio, diff) VALUES 
(123333, 'a', 1.3333, 5),
(125555, 'b', 1.6667, 1);

推荐答案

我们可以在这里使用ROW_NUMBER()进行两级排序:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY cl_id ORDER BY ratio DESC, diff DESC) rn
    FROM Have
)

SELECT id, cl_id, ratio, diff
FROM cte
WHERE rn = 1;

Sql相关问答推荐

Postgresql:从jsons数组到单个id索引的json

在postgres中动态计算出现次数并插入到json中

替换条件中的单元格值

在SQL中使用类别值将行转置为列

我可以在SQLite3中使用BLOB作为主键吗?

用VB.NET在Dapper中实现MS Access数据库顺序透视

Haystack针相交-在元素最多的Haystack中查找集合

如何使子查询在UPDATE语句期间获得最新更新

SQL:使用年/月/日分区查询某个时间段的数据

对现有记录进行分组

列(值不为空)到其他有序列

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

在presto sql中解析带有区域的时间格式

SQL获取两个日期范围之间的计数

oracle中多行的跨日期范围的交集

Select 字段,除非另一个字段包含重复项

在 MySql 数据库中的两个日期之间搜索

BigQuery - 将 TIMESTAMP 转换为 HH:MM:SS,然后识别 TIME_DIFF

CURRENT_ROW 窗口框架上的 SQL 滞后

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?