1

这可能很明显,我似乎无法让它正常工作。假设我有一张过去一年中每天的各种服务器及其 CPU 百分比的表格。我基本上想说:

“对于每个服务器名称,显示此服务器命中的最大 CPU 值(来自此数据集)以及它发生的相应日期”

所以理想情况下,我会得到如下结果:

服务器 1 52.34% 3/16/2012 服务器2
48.76%
4/15/2012 服务器3 98.32% 6/16/2012
等等。

当我尝试这样做时,我不能使用 group by 否则它只会显示每个日期:

从 cpu_values 组中选择 servername, date, max(cpu) by 1,2 order by 1,2;

这当然只是给了我每个服务器和每个日期.. 子查询?分区?任何援助将不胜感激!

4

2 回答 2

2

您可以使用row_number()OLAP 窗口功能:

   select   servername
          , cpu
          , date 
   from     cpu_values
   qualify  row_number() over (partition by servername
                               order by cpu desc) = 1

请注意,您不需要 GROUP BY 或 ORDER BY 子句。PARTITION 子句类似于 GROUP BY,而 ORDER BY 子句对每个分区内的行进行排序(在本例中按 cpu 降序排列)。“=1”部分选择满足条件的单行。

于 2012-07-28T14:37:41.833 回答
0

子查询将是最简单的解决方案:

SELECT
    S.Name, Peak.PeakUsage, MIN(S.Date) AS Date
FROM
    ServerHistory AS S
    INNER JOIN
        (
        SELECT
            ID, MAX(CPUUsage) AS PeakUsage
        FROM
            ServerHistory
        WHERE
            Date BETWEEN X AND Y
        GROUP BY
            ID
        ) AS Peak ON S.ID = Peak.ID
GROUP BY
    S.Name, Peak.PeakUsage

PS,下一次,你可能想用“SQL”标记。那里的 Teradata 人员相对较少,但可以帮助解决基本 SQL 问题的人很多。

于 2012-07-27T21:55:38.230 回答