SQL Group仅由相关行组成

时间:2018-03-15 14:59:02

标签: sql group-by vertica

说我有下表:

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非常相似

1 个答案:

答案 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