选择不同的和非不同的列值

Posted

技术标签:

【中文标题】选择不同的和非不同的列值【英文标题】:Select distinct and non-distinct column values 【发布时间】:2013-02-11 03:04:15 【问题描述】:

我想运行一个查询,根据 colA 和 colB 的值消除重复行。 但是,我仍然想返回 colC 和 colD 的值。

这是我目前所拥有的一个简单示例:

SELECT DISTINCT colA, colB   ?colC, colD?
FROM TABLE1

SELECT colA, colB    ?colC, colD?
FROM TABLE1
GROUP BY colA, colB

这两种方法都不允许我返回 colC 和 colD,除非我将它们检查为不同的值或 colA 和 colB 之类的组。我不想这样做,只有 colA 和 colB 需要区分,而不是 colC 和 colD。我只想退货。

关于如何实现这一点的任何想法?

【问题讨论】:

假设table1 中有多行具有一组特定的colAcolB 值,您希望返回哪一组colCcolD 值?最小值?最大值? “first”或“last”值(在这种情况下,您需要告诉我们如何对数据进行排序以使“first”和“last”有意义)? 你能发布一些示例数据和想要的结果吗? @JustinCave 你能详细说明我将如何使用“first”和“last”吗?我相信我总是想要第一个值。在我的示例中会怎样? @Baxter - “第一个”和“最后一个”依赖于某种方式来对数据进行排序。如果table1 中有两行具有相同的colAcolB 值,您怎么知道哪一行是“第一”行?是否有一些额外的列(例如时间戳,或单调递增的table1_id)? 【参考方案1】:

也许使用简单的集合操作

使用 UNION 和 UNION ALL (见http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries004.htm)

UNION colA 和 colB 将消除这些列中的双重条目,而 UNION ALL 将保留 colC 和 colD 中的所有值

【讨论】:

【参考方案2】:

DISTINCT 适用于您选择的所有值,而不仅仅是某些列。在您的情况下,它将适用于所有:colA、colB、colC、colD。不可能选择所有列并使一些不同而另一些不同。 Gordon 的示例中显示了这样做的唯一方法,这是唯一有效的示例和答案。

【讨论】:

我同意。我尝试将 min 用于我不关心是否唯一或有序的列。【参考方案3】:

你想要list_agg吗?

select colA, colB,
       list_agg(distinct colC, ','),
       list_agg(distinct colD, ',')
from Table1
Group by ColA, ColB

如果 ColC 和 colD 可以使用任意值,您可以使用min()

select colA, colB, min(colC), min(colD)
from Table1
Group by ColA, ColB

【讨论】:

我认为在这种情况下任何任意值都对我有用。我会在我不想分组的列上尝试一下。

以上是关于选择不同的和非不同的列值的主要内容,如果未能解决你的问题,请参考以下文章

为每个不同的列值选择第一行 [重复]

根据不同的列值选择一行(同一行)[重复]

根据第三列值在 bigquery 中选择两个不同的列

从不相关的表中选择不同的相同列值

如何检查来自不同数据框的列值?

如何在 Oracle 数据库中获取更多列值以及不同的列?