【问题标题】: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)?

标签: sql oracle select group-by distinct


【解决方案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
    

    【讨论】:

    • 我认为在这种情况下任何任意值都对我有用。我会在我不想分组的列上尝试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多