SQL:对类似数据组使用distinct

时间:2016-11-10 14:18:19

标签: sql distinct vertica

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    |
+------+------+------+

这是不可取的。

无论如何要做到这一点? 谢谢伙伴

3 个答案:

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