SQL基于多列查找组中的最佳行?

问题描述 投票:0回答:1

假设我有一个Oracle表,其中包含不同类别的度量:

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

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

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

这是greatest N per group问题的变体,但包括两列而不是一列。我怎样才能在SQL中表达这一点?

sql oracle greatest-n-per-group
1个回答
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子句首先放置那些具有最小错误的记录。如果同一类别中的两个或多个记录与最低错误相关联,那么下一个排序级别将首先创建具有最新创建日期的记录。

© www.soinside.com 2019 - 2024. All rights reserved.