Vertica中每组查询的前N个

时间:2014-07-02 13:00:17

标签: vertica

这是一个老问题 - 在Vertica中寻找最佳解决方案。想象一下包含列的表: -

A, B, C, D, E

列A-D是整数或变量,列E是timestamptz列,其默认值为GETUTCDATE()。

表格的示例内容: -

1, 2, "AAA", 4, 1404305559
1, 2, "BBB", 23, 1404305633
1, 2, "CCC", 62, 1404305705  <-- the max entry for (1,2,"CCC")
1, 2, "AAA", 123, 1404305740 <-- the max entry for (1,2,"AAA")
1, 2, "BBB", 91, 1404305778  <-- the max entry for (1,2,"BBB")

因此,复合(A,B,C)值可能存在重复行(列D为值,列E为时间戳)。

我希望结果集显示每个唯一(A,B,C)组合的最新行及其值。因此,上述结果集如下所示: -

1, 2, "CCC", 62, 1404305705  
1, 2, "AAA", 123, 1404305740 
1, 2, "BBB", 91, 1404305778  

1 个答案:

答案 0 :(得分:10)

让我们设置样本数据:

CREATE TABLE public.test (
  A int,
  B int,
  C varchar,
  D int, 
  E int
);

INSERT INTO public.test (A, B, C, D, E) VALUES (1, 2, 'AAA', 4, 1404305559);
INSERT INTO public.test (A, B, C, D, E) VALUES (1, 2, 'BBB', 23, 1404305633);
INSERT INTO public.test (A, B, C, D, E) VALUES (1, 2, 'CCC', 62, 1404305705);
INSERT INTO public.test (A, B, C, D, E) VALUES (1, 2, 'AAA', 123, 1404305740);
INSERT INTO public.test (A, B, C, D, E) VALUES (1, 2, 'BBB', 91, 1404305778);

COMMIT;

我们将使用RANK函数根据A, B, C对每一行进行排名,并对E进行排序,并仅返回位于顶部的行(排名为1)

SELECT a.a, 
       a.b, 
       a.c, 
       a.d, 
       a.e 
FROM   (SELECT a, 
               b, 
               c, 
               d, 
               e, 
               RANK() 
                 OVER ( 
                   PARTITION BY a, b, c 
                   ORDER BY e DESC) AS rank 
        FROM   public.test) a 
WHERE  a.rank = 1; 

返回:

 A | B |  C  |  D  |     E
---+---+-----+-----+------------
 1 | 2 | CCC |  62 | 1404305705
 1 | 2 | AAA | 123 | 1404305740
 1 | 2 | BBB |  91 | 1404305778