说我有下表:
Code A B C Date ID
------------------------------
50 1 1 A 2018-01-08 150001
50 1 1 A 2018-01-15 165454
50 1 1 B 2018-02-01 184545
50 1 1 A 2018-02-02 195487
我需要sql查询输出以下内容:
Code A B C Min(Date) Min(ID)
-------------------------------
50 1 1 A 2018-01-08 150001
50 1 1 B 2018-02-01 184545
50 1 1 A 2018-02-02 195487
如果我使用标准组,则行1,2,4分组为1行,这不是我想要的。 我想从基于列代码A,B和C的重复记录中选择具有MIN(日期)和MIN(id)的行 在这种情况下,前2行是重复的,所以我想要min()行。 第3和第4行是截然不同的。
请注意,数据库是Vertica 8.1,与Oracle或PostgreSQL非常相似
答案 0 :(得分:1)
我认为您需要分析功能 LAG()。使用此函数,您可以获取上一行的值(如果它是第一行本身,则为NULL)。因此,您可以检查上一行的值是否不同,并相应地进行过滤。
我不熟悉Vertica,但这应该是正确的文档:https://my.vertica.com/docs/7.0.x/HTML/Content/Authoring/SQLReferenceManual/Functions/Analytic/LAGAnalytic.htm
请尝试以下查询,它应该这样做:
SELECT l.Code, l.A, l.B, l.C, l.Date, l.ID
FROM (SELECT t.*,
LAG(t.C, 1) OVER (PARTITION BY t.Code, t.A ORDER BY t.Date) prev_val
FROM table_1 t) l
WHERE l.C != l.prev_val
OR l.prev_val IS NULL
ORDER BY l.Code, l.A, l.Date