这是一个老问题 - 在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
答案 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