选择不同的和非不同的列值
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
中有多行具有一组特定的colA
和colB
值,您希望返回哪一组colC
和colD
值?最小值?最大值? “first”或“last”值(在这种情况下,您需要告诉我们如何对数据进行排序以使“first”和“last”有意义)?
你能发布一些示例数据和想要的结果吗?
@JustinCave 你能详细说明我将如何使用“first”和“last”吗?我相信我总是想要第一个值。在我的示例中会怎样?
@Baxter - “第一个”和“最后一个”依赖于某种方式来对数据进行排序。如果table1
中有两行具有相同的colA
和colB
值,您怎么知道哪一行是“第一”行?是否有一些额外的列(例如时间戳,或单调递增的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
【讨论】:
我认为在这种情况下任何任意值都对我有用。我会在我不想分组的列上尝试一下。以上是关于选择不同的和非不同的列值的主要内容,如果未能解决你的问题,请参考以下文章