【发布时间】:2016-01-04 17:17:17
【问题描述】:
我有一种情况,我需要在现有应用程序中处理 EAV 数据,而重构不是一个选项,因此我无法更改数据的结构。也就是说,我有一个查询会返回这样的数据
| account | field | value | group |
|---------|-------|-------|-------|
| 1 | A | 1 | 1 |
| 1 | B | foo | 1 |
| 1 | A | 2 | 2 |
| 1 | B | foo | 2 |
| 1 | A | 2 | 3 |
| 1 | B | foo | 3 |
| 2 | A | 1 | 4 |
| 2 | A | 2 | 5 |
| 2 | A | 1 | 6 |
如果第 2 组和第 4 组分别具有所有相同的帐户、字段和值,我该如何删除第 3 组和第 6 组?
我想使用类似的东西
select account, field, value, rank() over (partition by account, field, value order by group)
但是根据之前是否看过每个特定行,组的成员会有不同的排名。
换句话说,是否有可能获得不同的“组”行,使用“组”列消除具有相同行数和相同值的其他行,其中不同的行数组可能不同?
编辑:
我不确定原来的例子是不是一个很好的例子。使用 distinct/unique 将不起作用,因为我对不同的行组感兴趣,而不是不同的行。作为一个更好的例子,考虑
| account | field | value | group |
|---------|-------|-------|-------|
| 1 | A | 1 | 1 |
| 1 | B | foo | 1 |
| 1 | A | 1 | 2 |
| 1 | B | bar | 2 |
| 1 | A | 2 | 3 |
| 1 | B | foo | 3 |
| 2 | A | 1 | 4 |
| 2 | A | 2 | 5 |
| 2 | A | 1 | 6 |
| 3 | A | 1 | 7 |
| 3 | B | foo | 7 |
| 3 | C | bar | 7 |
| 3 | A | 1 | 8 |
| 3 | B | foo | 8 |
| 3 | C | baz | 8 |
| 3 | A | 1 | 9 |
| 3 | B | foo | 9 |
| 3 | C | bar | 9 |
在这种情况下,我只想删除第 6 组和第 9 组,因为它们分别与第 4 组和第 7 组相同。我仍然需要保留有关其他组的所有信息,包括它们被分组的事实。
【问题讨论】:
-
如果您的组是另一个组的子集怎么办?例如。 (3, A, 1, 7) 和 (3, A, 1, 8) (3, B, boo, 8) ?在这种情况下应该显示哪些行?
-
@Boneist -- 应该显示所有这些组。我只想删除帐户、字段和值的数量和条目完全相同的组。 group 的具体值不重要,只有相同组号的行组成一个组。