假设我有一个Oracle表,其中包含不同类别的度量:
CREATE TABLE measurements (
category CHAR(8),
value NUMBER,
error NUMBER,
created DATE
)
现在我想在每个类别中找到“最佳”行,其中“best”定义如下:
这是greatest N per group问题的变体,但包括两列而不是一列。我怎样才能在SQL中表达这一点?
使用ROW_NUMBER
:
WITH cte AS (
SELECT m.*, ROW_NUMBER() OVER (PARTITION BY category ORDER BY error, created DESC) rn
FROM measurements m
)
SELECT category, value, error, created
FROM cte
WHERE rn = 1;
有关简要说明,PARTITION BY
子句指示DB为同一类别中的每组记录生成单独的行号。 ORDER BY
子句首先放置那些具有最小错误的记录。如果同一类别中的两个或多个记录与最低错误相关联,那么下一个排序级别将首先创建具有最新创建日期的记录。