Hello Mates我在Vertica数据库中遇到以下问题:我有一个大表
+------+------+------+
| Date | Col1 | Col2 |
+------+------+------+
| 1 | A | B |
| 2 | A | B |
| 3 | D | E |
| 2 | C | D |
| 1 | C | D |
+------+------+------+
正如您所看到的,我有冗余数据,只是在不同日期拍摄(第1行和第2行以及第4行和第5行)。所以我想通过删除具有较低日期的行来删除冗余数据的表,给我一个这样的结果:
+------+------+------+
| Date | Col1 | Col2 |
+------+------+------+
| 2 | A | B |
| 2 | C | D |
| 3 | D | E |
+------+------+------+
使用distinct不会起作用,因为它会随意删除行而不考虑日期,所以我最终会得到一个这样的表:
SELECT DISTINCT Col2, Col3 from Table
+------+------+------+
| Date | Col1 | Col2 |
+------+------+------+
| 2 | A | B |
| 1 | C | D |
| 3 | D | E |
+------+------+------+
这是不可取的。
无论如何要做到这一点? 谢谢伙伴
答案 0 :(得分:4)
在2列上执行GROUP BY
并在最高日期汇总:
SELECT MAX(Date), col1, col2
FROM table
GROUP BY Col1, Col2
答案 1 :(得分:2)
我只是在这里概括模式并添加一个,对于问到这些方法可能有效的确切问题,魔鬼就在细节中。
@Thomas_G提出的聚合方法之所以有效,是因为在分组之外只有1列。如果你有两个它可以混合/匹配(一行中的一些数据,一些来自另一行),这可能不是你想要的重复处理策略。
@Gordon_Linoff提出的分析方法很好,但请注意,如果日期在源数据中重复,那么如果它们在最大日期存在,您将获得多行。这可能是你想要的,但也许不是。
另一种方法是剥离窗口的顶行。它将根据您的窗口顺序选择分区中的第一行。如果最多有多个日期,那么除非您在窗口顺序中包含更多内容,否则无法保证选择哪个日期。但至少你知道你只会获得一排,这是值得的。
select t.*
from (select t.*, row_number() over (partition by col1, col2 order by date desc) as rn
from t
) t
where rn = 1;
答案 2 :(得分:1)
如果您关心其他列,则可以使用窗口函数:
select t.*
from (select t.*, max(date) over (partition by col1, col2) as maxd
from t
) t
where date = maxd;