SQL 仅按相关行分组

SQL Group by only correlative rows

假设我有以下 table:

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 行,这不是我想要的。 我想 select 来自重复记录的 MIN(date) 和 MIN(id) 行,这些记录基于列代码 A、B 和 C 在这种情况下,第一行和第二行是重复的,所以我想要 min() 行。 第三行和第四行是不同的。

请注意,数据库是 Vertica 8.1,与 Oracle 或 PostgreSQL 非常相似

我认为您需要分析函数 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