SQL仅按相关行分组

SQL仅按相关行分组,sql,group-by,vertica,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) ----

假设我有下表:

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
如果我使用标准group by,则第1、2、4行被分组到一行中,这不是我想要的。 我想从基于列代码A、B和C的重复记录中选择包含MIN(日期)和MIN(id)的行 在本例中,前两行是重复的,因此我需要min()行。 第三排和第四排是不同的


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

我认为您需要分析函数LAG()。使用此函数,可以获得前一行的值(如果它是第一行本身,则为NULL)。因此,您可以检查前一行上的值是否不同,并进行相应的筛选

我不熟悉Vertica,但这应该是正确的文档:

请尝试下面的查询,它应该这样做:

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

为什么初始行数为4,结果为3?您采用了哪些列进行分组?我的分组方式是:Code、A、B和C。如果执行标准的group by查询,我会得到2行,但结果中需要3行。是的,这是group by的工作。但从任何角度看,您的输出都不是分组的结果。为什么需要A的值两次?在结果中,第1行和第3行应该分组,不是吗?group by code,a,b,c只给出了2行您给我们的数据。在我想要的结果中,第1行和第2行被分组,因为它们是按ID和日期分类的,而第4行没有分组,因为前面有不同的行。查询的最后一点是删除没有给我们相关信息的行。是的,这正是我要查找的。它起作用了!但是我的表有几列要比较。有没有其他方法让它更简单?@AbelMartinez我想这更像是一个过程问题,而不是一个纯粹的SQL问题。您可以使用SQL的分析函数来解决这个问题,但在Oracle中,仅使用PL/SQL可能更容易解决这个问题。添加更多的列是否会变得太复杂?我想不出一个不同的解决方案,而且我没有实际的例子,所以我不能说。也许你可以为此提出一个新问题