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
假设我有以下 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