SQL基于多个列在组中找到最佳行?

时间:2019-03-01 13:40:07

标签: sql oracle greatest-n-per-group

比方说,我有一个Oracle表,其中包含不同类别的度量值:

CREATE TABLE measurements (
  category CHAR(8),
  value NUMBER,
  error NUMBER,
  created DATE
)

现在,我想在每个类别中找到“最佳”行,其中“最佳”的定义如下:

  • 错误率最低。
  • 如果存在多个具有相同误差的测量,则认为最近创建的测量是最好的。

这是greatest N per group问题的一种变体,但包括两列而不是一列。如何用SQL表达这一点?

1 个答案:

答案 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 错误的记录放在第一位。如果同一类别中的两个或更多记录的错误率最低,那么下一个排序级别将把具有最近创建日期的记录放在第一位。