比方说,我有一个Oracle表,其中包含不同类别的度量值:
CREATE TABLE measurements (
category CHAR(8),
value NUMBER,
error NUMBER,
created DATE
)
现在,我想在每个类别中找到“最佳”行,其中“最佳”的定义如下:
这是greatest N per group问题的一种变体,但包括两列而不是一列。如何用SQL表达这一点?
答案 0 :(得分:3)
使用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
子句将那些记录出现 smallest 错误的记录放在第一位。如果同一类别中的两个或更多记录的错误率最低,那么下一个排序级别将把具有最近创建日期的记录放在第一位。